Programowanie w języku Delphi

Random

Random
Moduł: System

function Random [ ( Range: Integer) ];

Losuje liczbę z przedziału określonego parametrem Range, dokładniej: 0 <= X < Range.

Jeżeli nie chce się aby liczby powtarzały się przy każdym uruchomieniu programu, należy wywołać funkcję Randomize, która ustawia randseed na aktualny czas.

Ponieważ rezultatem działania tej funkcji może być zero, warto do wyników dodać liczbę 1

program Foo;
 
{$APPTYPE CONSOLE}
 
var
  I : Integer;
 
begin
  Randomize;
  for I := 0 to 10 do
    Writeln('Wylosowałem: ', Random(1000));
  Readln;
end.

function Throw(sides: Integer) : Integer;
begin
  Result := Random(sides) + 1;
end;

Jeżeli chcesz żeby liczby nie powtarzały się przy każdym uruchomieniu programu, nie zapomnij dodać na początku programu Randomize()

Zobacz też:

15 komentarzy

payl 2012-01-02 18:53

" chodzi o to, jak pisze w literaturze fachowej i oficjalnych dokumentacjach." - ah, było tak odrazu, bo widać mam nieoficjalne i niefachowe źródła które wspominają o czymś takim. Po prostu zrób tak żeby ci pasowało, bo w końcu ty jesteś 100% zgodny ze wszystkimi fachowymi i oficjalnymi źródłami. Zabawne, nie liczy się czy jest dobrze, tylko czy jest zgodnie (tfu, przecież oficjalnie to synonim dobrze). I mam małą prośbę: Daruj sobie odpisywanie tylko zrób tak jak uważasz. Nie chce mi się już z tobą rozmawiać na takie tematy, zwłaszcza gdy mówisz że nie liczy się czy jest dobrze, tylko czy jest pokrycie z tym co ktoś (pseudo?)mądry napisał.

jakubkrol 2012-01-02 18:11

@payl - eh, przecież widzę kod źródłowy iw Delphi jest taki sam... Nie chodzi o to, chodzi o to, jak pisze w literaturze fachowej i oficjalnych dokumentacjach.

payl 2012-01-02 18:08

"Ale nie możemy dawać na "programistyczną encyklopedię" tego, co Tobie się wydaje, nawet jeżeli to jest prawidłowe. Trzymajmy się tego, co podaje producent - jeżeli tak podaje. Takie jest moje zdanie." - Producent Delphi? Ktoś tu zapomina o opensourcowych odpowiednikach. Patrzyłem w kod FPC, tam jest jak byk napisane Randomize tak: randseed:=GetTickCount;. Żadnej magii tu nie ma, faktem jest że jeżeli nie wywołasz Randomize to przy każdym uruchomieniu liczby się powtórzą. Czy ja napisałem coś co wykracza poza udowodnioną i potwierdzoną wiedzę? Nic. Jeżeli masz jeszcze jakieś zastrzeżenia, to edytuj. Nie mam zamiaru się kłócić o byleco. W końcu wygląda na to że tutaj ja wiem najmniej i muszę udowadniać takie rzeczy jak to że Randomize nie jest wymagane do Random...

jakubkrol 2012-01-02 16:47

@payl - ja rozumiem, że tu chodzi o poziom. Faktem jest też, że to co przytoczyłeś trochę go zaniża. Ale nie możemy dawać na "programistyczną encyklopedię" tego, co Tobie się wydaje, nawet jeżeli to jest prawidłowe. Trzymajmy się tego, co podaje producent - jeżeli tak podaje. Takie jest moje zdanie.

payl 2012-01-02 15:18

"Wg mnie nie powinniśmy uważać, że mamy prawo pisać inaczej, bo tak, tylko tak jak jest to napisane tutaj - że POWINNO SIĘ zainicjalizować - albo Randomizem, albo RandSeedem." - Inicjalizacja to wg mnie: operacja WYMAGANA do działania komponentu którego dotyczy. Randomize nie trzeba wykonywać przed random, nie powoduje to błędu. Dlatego w moim widzeniu Randomize nie inicjalizuje, tylko powoduje pseudolosowość. I faktem jest, że Randomize nie trzeba wywoływać, jeżeli chce się aby liczby nie powtarzały się/używa się innego sposobu ustawienia randseed. Nikt nie zaprzecza że Randomize nie jest potrzebne, a wy i tak chcecie żeby było napisane że NALEŻY/powinno się go wykonywać. Ja napisałem tak jak jest, że nie potrzeba go wykonywać jeżeli nie potrzebuje się zmienności liczb - i jest w tym więcej prawdy niż w waszym stwierdzeniu. Takie jest przynajmniej moje zdanie. A tak generalnie to informacje w tym arcie są w sporej części uproszczone do bólu/nieprzydatne.('Ponieważ rezultatem działania tej funkcji może być zero, warto do wyników dodać liczbę 1' - już lepszej porady nie można było dać, może jeszcze: 'Ponieważ jest to funkcja, należy za nią dać średnik (to jest to: >;<)'). Ja wiem że do wszystkiego podchodzę od strony jakbym wymagał od tego niewiadomo jak wysokiego poziomu, no ale sorry, chyba mam prawo wymagać chociaż braku informacji/uproszczeń na poziomie początkującym - od tego są tutki.

jakubkrol 2012-01-02 14:06

@PayL - może zacytuję oficjalną dokumentację Delphi... "Randomize initializes the built-in random number generator with a random value (obtained from the system clock). The random number generator should be initialized by making a call to Randomize, or by assigning a value to RandSeed. ". Wg mnie nie powinniśmy uważać, że mamy prawo pisać inaczej, bo tak, tylko tak jak jest to napisane tutaj - że POWINNO SIĘ zainicjalizować - albo Randomizem, albo RandSeedem.

payl 2012-01-02 00:04

"uważam, że powinno być napisane, że przed wywołaniem funkcjo Random() należy raz w programie wywołać funkcję Randomize()" - Nie trzeba wywoływać Randomize ani razu przed Random. Wywołanie Randomize ustawia tylko randseed. Więc nie trzeba tego wykonywać ani razu, jeżeli chce się żeby przy każdym powtórzeniu programu były losowane takie same liczby (przydatne przy debugowaniu). Chciałbym też zauważyć że ten opis nie jest pisany specjalnie pod nowicjuszy ale pod wszystkich, więc powinna tutaj być informacja że nie trzeba tego wywoływać ani razu. A dla nowicjuszy są tutoriale, tam możesz to uprościć. Więc tłumacząc wprost: To że randomize inicjuje generator liczb pseudolosowych należy włożyć między bajki. On tylko doprowadza do zmienności tych danych.

jakubkrol 2012-01-01 19:53

Nie zgadzam się z tymi zmianami troszkę...
"Jeżeli nie chce się aby liczby powtarzały się przy każdym uruchomieniu programu, należy wywołać funkcję Randomize, która ustawia randseed na aktualny czas." - uważam, że powinno być napisane, że przed wywołaniem funkcjo Random() należy raz w programie wywołać funkcję Randomize(), a dopiero potem, że nie jest to wymagane, ale inicjuje automatycznie generator liczb pseudolosowych tak, by losowane liczby nie były takie same. Takie dokładne napisanie jak teraz jest powoduje, że uczący się programować w Delphi tego zwyczajnie mogą nie doczytać.... A potem się dopytują o jedno i to samo... Pozdr ;)

bogdans 2011-06-14 19:45

Popraw ten koszmarny błąd: warto do wyników dodać cyfrę 1, ma być dodać liczbę 1. Przy okazji sprawdź czy nie da się lepiej napisać nierówności nieostrej, może dopuszczalny jest tex, w html-u można napisać & le ; (bez tych spacji) wyjdzie z tego ≤

jakubkrol 2011-05-07 11:07

Uważam, że w funkcjo Throw nie powinno być zdecydowanie Randomize;. Zaprzecza to zaleceniom, by używać tego wyłącznie raz w programie, a funkcje tworzy się po to, aby wywoływać coś kilka razy - toteż jest to troszkę moim zdaniem wprowadzenie w błąd. Nie wiem, czy nie poprawniej było by usunąć Randomize; ei niżej dać notkę informującą, że w programie należy najpierw raz wykonać funkcję Randomize();.

Patryk27 2011-05-07 08:29

Poprawiłem ;)

TomRiddle 2011-05-07 08:23

Zamiast...
B := Random();
Result := B;
...możesz
Result := Random();

jakubkrol 2010-12-29 14:09

@djmentos - haha, zarąbisty komentarz xddd poprawiłeś mi humor xd

djmentos 2007-12-04 22:10

ostatnio chciałem użyć random i wszystko ok, gdyby nie to że pluje sie na niego pełno antywirusów.