|
Тема |
Re: Как да... [re: lnfoMatic] |
|
Автор | _ (Нерегистриран) | |
Публикувано | 26.04.01 18:15 |
|
|
towa koeto si napisal e za sluchaina podredba na N chisla (predwaritelno namisleni) - po-razbiraemo shteshe da e da napishesh
che N pyti triabwa da se naprawi razmiana na 2 proizwolni index-a: Swap( a[ rand(N) ] , a[ rand(N) ] )
taka poluchawame izbranite N chisla w sluchaen red
no dokolkoto razbrah wyprosyt e da se nameraiat niakolko sluchaini chisla (predpolagam w diapazona ot 0 do 2^32 -1 ), no bez powtorenia
wyzmojnite reshenia zawisiat ot diapazona za izbor i broia na neobhodimite chisla
- primerno ako triabwa da izberem 999 995 sluchaini chisla ot 1 do 1000000, bez da se powtariat - po-dobre e da namerim 5 "neizbrani" chisla - da si wzemem wsichki ostanali.
- pri generiraneto na chislata da proweriawame dali towa chislo weche ne e izbrano - ako chislata sa celochisleni - moje da se izpolzwa bitow masiw (1-ca kogato chisloto e izbrano), ako diapazonyt ne e goliam i broiat chisla koito ni triabwat syshto ne e goliam
- IMHO ost beautiful way (e.. i toi si e za opredeleni sluchai podhodiash samo)
want M numbers from 1 to N
dopuskame che rand() wryshta chislo mejdu 0 i 1. [0;1)
psewdokod:
wanted_numbers = M;
numbers_left = N;
for i = 1 to N do
if rand() < wanted_numbers / numbers_left then
print i (* wzimame i *)
wanted_numbers = wanted_number - 1
numbers_left = numbers_left - 1
taka poluchawame naredeni M na broi sluchaini chisla w diapazona 1 do N, ako iskame i da sa w sluchaen red - nomera sys sluchainata razmiana na mestata wyrhi rabota.
|
| |
|
|
|