Chciałem się upewnić czy dobrze wybrałem zakres do losowania
random(100)+1900 zakres [1900,2000)
random(99)+1 zakres [1,100)
random(100) zakres [0,100)
random(12) zakres [1,13)
Chciałem się upewnić czy dobrze wybrałem zakres do losowania
random(100)+1900 zakres [1900,2000)
random(99)+1 zakres [1,100)
random(100) zakres [0,100)
random(12) zakres [1,13)
nie, wszędzie się pomyliłeś
Random(x) losuje z zakresu [0..x-1] bądź [0..x)
@babubabu on się pomylił tylko w ostatnim przykładzie, gdzie powinien napisać [0, 13) albo [0, 12], poza tym wszędzie napisał dobrze, zawsze występuje przedział prawostronnie otwarty.
Dzięki za pomoc. Mam kolejne pytanie co do losowania liczb, wiec nie będę zakładał kolejnego tematu.
Mianowicie co jeśli chce losować z zakresu <-50,-10) i (10,50> w jednym random, jak to zapisać?
randomize;
writeln((random(40)+10) * (- 1));
writeln(random(41)+10);
a := (random(40)+10) * (- 1);
b := random(41)+10;
writeln(a or b);
function RandomRange(AFrom, ATo : Integer) : Integer;
begin
result := Random(ATo - AFrom) + AFrom;
end;
A jakieś inne rozwiązanie bez funkcji?
Możesz surowo rzucić flakami tejże funkcji... tylko po co?
Random nie umożliwia wylosowania jednej liczby, mogącej sę znajdować w jednym z kilku przedziałów; RandomRange jest zaimplementowany w module Math
;
Mianowicie co jeśli chce losować z zakresu <-50,-10) i (10,50> w jednym random, jak to zapisać?
W jednym raczej nie da rady;
intNumber := RandomRange(11, 51) * (-1 + Random(2) * 2); // ewentualnie popraw zakresy
RandomRange powinien być chyba (10,51), tylko problem w tym, że nie rozumiem dalszej części kodu. Dlaczego nie np. -1+ Random(41) - chodzi mi o to, żeby losował z tego przedziału losowo dodatnie i ujemne liczby. Możesz mi wytłumaczyć o co chodzi z tym * (-1 + Random(2) * 2)?
intNumber := RandomRange(10, 51) * (-1 + Random(2) * 2);
RandomRange powinien być chyba (10,51), [...]
RandomRange działa praktycznie tak samo co Random - losuje liczbę z zakresu od AFrom
do ATo - 1
; Ty potrzebujesz liczby z zakresu od 11
(bez 10
) do 50
, czyli w AFrom
podajesz 11
, a w ATo
podajesz 51
- minimalną będzie 11
, natomiast maksymalną wylosowaną liczbą będzie ATo - 1
, czyli 51 - 1
, co daje 50
;
Możesz mi wytłumaczyć o co chodzi z tym * (-1 + Random(2) * 2)?
Z racji tej, że te dwa przedziały różni jedynie znak (zakresy liczb -50 .. 11
oraz 11 .. 50
), wystarczy najpierw wylosować liczbę dodatnią z dodatniego przedziału, a następnie "wylosować jej znak", plus albo minus; Znaku losować nie możemy, więc trzeba wylosować liczbę, przez którą pomnoży się tę wylosowaną z zadanego zakresu;
Random(2)
wylosuje liczbę 0
lub 1
, mnożymy przez 2
i otrzymujemy albo 0 * 2
albo 1 * 2
, czyli albo 0
albo 2
; Teraz dodajemy ją do magicznej liczby -1
i otrzymujemy albo -1
, albo 1
; Pomnożenie liczby przez 1
da taką samą liczbę, natomiast pomnożenie przez -1
da liczbę przeciwną (np. z 5
zrobi -5
, a z -5
zrobi 5
);
Przykład:
{
Pierwszy przykład:
* RandomRange - 20
* Random - 1
}
RandomRange(11, 51) * (-1 + Random(2) * 2);
20 * (-1 + 1 * 2);
20 * (-1 + 2);
20 * 1
20 // wynik
{
Drugi przykład:
* RandomRange - 17
* Random - 0
}
RandomRange(11, 51) * (-1 + Random(2) * 2);
17 * (-1 + 0 * 2);
17 * (-1 + 0);
17 * (-1);
-17 // wynik
Pierwsza linijka każdego przykładu to wzór w postaci kodu, druga linijka to już konkretne przykładowe wartości, podsawione w miejsca funkcji, a kolejne to obliczenia; Jak widać nic trudnego;
Jeśli przedziały nie będą symetryczne względem 0
to powyższego wzoru nie będzie można zastosować;
PS: Ewentualnie zamiast (-1 + Random(2) * 2)
można użyć RandomFrom
, także z modułu Math
:
intNumber := RandomRange(11, 51) * RandomFrom([Integer(1), -1]);
Kody dotyczą Free Pascala i pod nim były sprawdzane.
Jeśli użyje 2 razy random to wyjdzie na to samo?
t[i] := Random(40)+11 * (-1 + Random(2) * 2);
Tak, pod warunkiem, że będzie się zgadzało z zakresami (to sobie sprawdź); Użyta przeze mnie funkcja RandomRange miała na celu jedynie zwiększenie czytelności, bo można ją zastąpić zwykłym Random z dodawaniem, czyli tak jak pokazałeś wyżej.