Centrum Skryptów - Systemy Operacyjne

W jaki sposób używając skryptu można generować liczby losowe? Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

Cześć Skrypciarze!

Witamy w rubryce TechNet, w której Skrypciarze z firmy Microsoft odpowiadają na częste pytania dotyczące używania skryptów w administracji systemu. Jeśli macie jakieś pytania z tej dziedziny, zachęcamy do wysłania e-maila na adres: scripter@microsoft.com. Nie możemy zagwarantować odpowiedzi na każde otrzymane pytanie, ale staramy się jak możemy.

W jaki sposób używając skryptu można generować liczby losowe?

Cześć, Skrypciarzu! Audytorzy w naszej firmie żądają, abyśmy losowo wybrali projekty które mają zostać poddane kontroli pod kątem realizacji i zgodności z polityką firmy. Projekty są ponumerowane, więc pomyślałem, że można napisać skrypt losowo wybierający numery projektów do kontroli. Czy możemy liczyć na Waszą pomoc?

-- Daniel

Cześć, Danielu. Wiesz co, gdybyś poszukiwał czegoś uporządkowanego, konsekwentnego i rzetelnego, musielibyśmy odesłać Cię gdzie indziej. Ale skoro zależy ci na chaosie i nieprzewidywalności, nie mogłeś trafić lepiej.

Jak się okazuje, VBScript posiada wbudowaną funkcję (o pięknej nazwie Rnd), służącą tylko i wyłącznie do generowania liczb losowych. Spójrzmy na skrypt generujący 5 liczb losowych od 1 do 100. Potem wyjaśnimy, jak to działa:

intHighNumber = 100

intLowNumber = 1



For i = 1 to 5

    Randomize

    intNumber = Int((intHighNumber - intLowNumber + 1) * Rnd + intLowNumber)

    Wscript.Echo intNumber

Next

Jak widać, najpierw definiujemy wartości dwu różnych zmiennych: intHighNumber (oznaczającej górną granicę zakresu) i intLowNumber (czyli dolną granicę zakresu). Co by było gdybyśmy chcieli wygenerować liczby losowe od 37 do 956? Musielibyśmy po prostu zmienić wartości zmiennych intHighNumber i intLowNumber:

intHighNumber = 956

intLowNumber = 37

Teraz włączamy pętlę For Next, która zadziała 5 razy. Wewnątrz pętli umieszczamy następujace trzy wiersze kodu:

Randomize

intNumber = Int((intHighNumber - intLowNumber + 1) * Rnd + intLowNumber)

Wscript.Echo intNumber

Pierwszy wiersz – na który składa się jedynie instrukcja Randomize – jest bardzo ważny. Funkcja ta używa czasu systemowego jako wartości podstawowej funkcji Rnd. Czas systemowy jest za każdym razem inny, wiec funkcja ta będzie miała większe szanse na wygenerowanie liczby naprawdę losowej. Można nawet wypróbować ten skrypt bez instrukcji Randomize:

intHighNumber = 100

intLowNumber = 1



intNumber = Int((intHighNumber - intLowNumber + 1) * Rnd + intLowNumber)

Wscript.Echo intNumber

Można go uruchamiać dowolną liczbę razy, a zawsze generowana będzie ta sama liczba „losowa”. (Na naszym komputerze jest to za każdym razem 71.)

Kolejny wiersz kodu odpowiedzialny jest za generowanie liczby losowej:

intNumber = Int((intHighNumber - intLowNumber + 1) * Rnd + intLowNumber)

Funkcja Rnd posiada algorytm, który używany jest do generowania liczb losowych; my musimy tylko uwzględnić w równaniu nasze dwie zmienne (intHighNumber i intLowNumber). Oprócz tego, dzięki użyciu funkcji Int mamy pewność, że uzyskamy liczbę całkowitą. Wiersz ten wygląda nieco dziwnie, ale nie ma się co martwić – wystarczy w odpowiednie miejsca wpisać pożądane wartości i nie zaprzątać sobie głowy.

To by już właściwie było na tyle; wywołujemy echo wygenerowanych liczb, po czym ponawiamy pętlę i generujemy kolejną liczbę. Kiedy skończymy, powinniśmy uzyskać listę liczb podobną do poniższej:

82

15

92

32

13

A swoją drogą, czy metoda ta nadaje się do generowania liczb do totolotka? Owszem. Czy zwiększa szanse na szóstkę? No cóż, ujmijmy to tak: Skrypciarze ciągle jeszcze co dzień muszą chodzić do pracy. Domyślności naszych czytelników pozostawiamy, czy robilibyśmy to hobbystycznie po wygraniu stu milionów dolarów.

 Do początku strony Do początku strony


Centrum Skryptów - Systemy Operacyjne