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ę.