Serwisy partnerskie:
Close icon
Serwisy partnerskie

Sprytne porady i sztuczki cyklu Ekscytacje Maxa dotyczące kodowania (13)

Article Image
Od czasu do czasu chcemy dodać pewną dozę losowości do naszych programów. Na przykład, możemy chcieć stworzyć elektroniczną wersję kostki do gry. W takim przypadku musimy użyć pewnego rodzaju generatora liczb losowych (RNG). W rzeczywistości wygenerowanie prawdziwie losowej sekwencji liczb jest bardzo trudne. Łatwiejszą alternatywą jest generator liczb pseudolosowych (PRNG), znany również jako „deterministyczny generator bitów losowych” (DRBG), który jest algorytmem generowania sekwencji liczb, których właściwości są zbliżone do właściwości sekwencji liczb prawdziwie losowych.

Arduino

Zwracamy więc naszą uwagę na Arduino i jego funkcję random(), która pozwala nam generować pseudolosowe liczby całkowite z określonego przez nas minimalnego i maksymalnego zakresu. Ogólnie rzecz biorąc, twórcy Arduino starali się uczynić rzeczy tak prostymi, jak to tylko możliwe dla początkujących. Jednak z powodów, które nie sposób wytłumaczyć, zdecydowali się uczynić wartość minimalną jako włączoną do generowanego zakresu liczb, podczas gdy zadeklarowana wartość maksymalna jest z tego przedziału wyłączona. Rozważmy na przykład następującą instrukcję: int tmpRnd = random(5, 10);

W tym przypadku tmpRnd będzie zawierać pseudolosową wartość z przedziału 5, 6, 7, 8 i 9, ale nie 10, ponieważ 5 (wartość minimalna) zawiera się w zadanym zakresie, podczas gdy 10 (wartość maksymalna) jest wykluczona. Jeśli podano tylko jedną wartość, to przyjmuje się, że jest to wartość maksymalna, a minimalna jest automatycznie ustawiana na zero, więc random(10) daje identyczne wyniki jak random(0,10).

Fajną rzeczą w funkcji random() Arduino jest to, że pozwala ona generować liczby ujemne, więc random(-10,10) zwróci losową wartość pomiędzy –10 a +9.

Co za wspomnienie!

Jak zobaczymy za chwilę, PRNG muszą otrzymać początkową wartość „ziarna losowości”, zanim wykonają swoją magię. O ile jej nie nadpiszemy, Arduino użyje jakiejś domyślnej wartości ziarna losowości (nie mam pojęcia, jaka to wartość). Co więcej, PRNG Arduino będzie klasyfikowany jako nieulotny, ponieważ – domyślnie – będzie «pamiętał» i wykorzystywał tę samą wartość seed za każdym razem, gdy zostanie włączony. Rozważmy na przykład następujący fragment kodu, który generuje grupy pięciu liczb pseudolosowych z zakresu od 0 do 99:

void loop()
{
for (int iRnd = 0; iRnd < 5; iRnd++)
{
int tmpRnd = random(0, 100);
Serial.println(tmpRnd);
}
}

Kiedy uruchamiam ten kod na moim Arduino Uno, otrzymuję następującą sekwencję liczb (dla przejrzystości podzieliłem je na grupy po pięć): 7, 49, 73, 58, 30; 72, 44, 78, 23, 9... Za każdym razem, gdy ponownie uruchamiam program, otrzymuję dokładnie tę samą sekwencję.

Aby przeczytać ten artykuł kup e-wydanie
Kup teraz
Firma:
Tematyka materiału: Arduino, Jeszcze więcej losowości
AUTOR
Źródło
Elektronika dla Wszystkich listopad 2024
Udostępnij
Zobacz wszystkie quizy
Quiz weekendowy
Theremin
1/10 Lew Termen i Leon Theremin to ta sama osoba. Które nazwisko pojawiło się później?
Oceń najnowsze wydanie EdW
Wypełnij ankietę i odbierz prezent
W tym numerze znajdziesz źródłową wersję artykułu publikowanego obok
Elektronika dla Wszystkich
listopad 2024
Elektronika dla Wszystkich
Przejrzyj i kup
UK Logo
Elektronika dla Wszystkich
Zapisując się na nasz newsletter możesz otrzymać GRATIS
najnowsze e-wydanie magazynu "Elektronika dla Wszystkich"