Losowanie liczby zawartej w jednym z dwóch przedziałów

0

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)
0

nie, wszędzie się pomyliłeś
Random(x) losuje z zakresu [0..x-1] bądź [0..x)

4

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

0

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);
1
 
function RandomRange(AFrom, ATo : Integer) : Integer;
begin
  result := Random(ATo - AFrom) + AFrom;
end;
0

A jakieś inne rozwiązanie bez funkcji?

0

Możesz surowo rzucić flakami tejże funkcji... tylko po co?

0

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

http://ideone.com/QIQgNq :D

0

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);
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]);

http://ideone.com/EdUv60

Kody dotyczą Free Pascala i pod nim były sprawdzane.

0

Jeśli użyje 2 razy random to wyjdzie na to samo?

t[i] := Random(40)+11 * (-1 + Random(2) * 2);
0

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.

0 użytkowników online, w tym zalogowanych: 0, gości: 0