|
Тема
|
Как да...
|
|
Автор | Philip (Нерегистриран) |
Публикувано | 26.04.01 16:41 |
|
Този път един въпрос от мен.
Хванах се да си поиграя малко, като драсна някой и друг ред на Pascal. Turbo Pascal 7.1 в случая, но едва ли има значение.
Какъв е проблема? Искам да дефинирам чрез случаен избор няколко числа, но така, че да няма дублиране. А ми се вижда доста тромаво да се прави проверка за всяко от числата (и ако се повтаря, да се генерира ново случайно число, до липса на повтаряне).
Няма ли някакъв начин да се ползва нещо от типа:
random (максимум; изключения, записани като променливи);
Търсих по Help-овете, но такова нещо не намерих. Има ли начин да се направи?
| |
Тема
|
Re: Как да...
[re: Philip]
|
|
Автор |
jamie (подминаващ) |
Публикувано | 26.04.01 16:43 |
|
Раздели си диапазона на зони и вземи по едно число от зона.
don't waste my time - waste yours !
| |
|
Значи можеш да опиташ следното: искаш да изкараш всички числа от 1 до N например. В един масив запомняш числата от 1 до N. Правиш един цикъл от 1 до N-1, като всеки път правиш следното: генерираш число в диапазона [1, N-1+i](i ти променливата от цикъла), взимаш стойността на i -тата позиция(това което ти трябва), и на нейно място записваш стойността на N-1+i. Понеже май и аз се замотах, ще се опитам, да ти го кажа така, че и аз да го разбера :)
Ако ти трябват всички числа от 1 то 10, първия път генерираш число от 1 до 10, примерно получаваш 3, взимаш стоиността на позиция 3, на нейно място записваш стойността от 10 позиция. Втория път генерираш число от 1 до 9, взимаш стойността на генерираната позиция, на нейно място записваш 9-та позиция, третия път генерираш от 1 до 8 и т.н.
Успех !
| |
Тема
|
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.
| |
Тема
|
Re: Как да...
[re: Philip]
|
|
Автор | seeker (Нерегистриран) |
Публикувано | 26.04.01 18:25 |
|
ami varianta da kaznem dvumeren masiv
ako "izteglish" dadeno chislo vav vtorata dimesnia pishesh 1 i da kazhem che po default tam e 0
posle na vsiaka proverka pravish dali ima veche 1 ako da - "teglish" pak
inache ideiata da se generirat niakolko intervala i da se tegli v tiah e dobra zashtoto tochno random generatora na Pascal e dosta ne random
predi mnogo vreme kogato si pisah diplomata rabota mi triabvashe i ne pomnia sled kolko prevartania mozheh da vastanovia parvonachalnata podredba
| |
Тема
|
uh
[re: _]
|
|
Автор | _ (Нерегистриран) |
Публикувано | 26.04.01 18:28 |
|
otstypite ne se poiawiha w posting-a i ....
ne che sega shte se poiawiat - no pone shte e po-razbiraemo.
shte go napisha oshte wednyj - s { } ('begin' i 'end' sydyrjat twyrde mnogo bukwi.. :))
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_numbers - 1
}
numbers_left = numbers_left - 1
}
| |
Тема
|
Re: Как да...
[re: seeker]
|
|
Автор | _ (Нерегистриран) |
Публикувано | 26.04.01 18:34 |
|
kakwo pyk mu e na random genaratora na Pascal? :))))
na men lichno da se opredeliat diapazoni i da se izbirat w tiah chisla - ne mi zwuchi mnogo "random".
primerno ako ti triabwat 2 chisla ot 1 do 10 - i si go razbelish ot 1 do 5 i ot 6 do 10, nikoga niama da se sluchi primerno da izberesh 1 i 3 ili 8 i 10, koeto ne e nikak random za 2 chisla ot 1 do 10...
| |
Тема
|
Re: Как да...
[re: Philip]
|
|
Автор |
TRN (непознат
) |
Публикувано | 26.04.01 21:34 |
|
Вместо масив,създай обект TCollection.Малко по сложно е , но въпросът ти се решава, чрез използване на функциите FirstThat или LastThat
| |
Тема
|
Re: uh
[re: _]
|
|
Автор |
lnfoMatic (непознат
) |
Публикувано | 27.04.01 09:37 |
|
Прав си. С размяната на елементите на масив е много елегантно решение, което може да свърши работа в 99%. .
P.S Ако искаш да не ти се разместват шпациите слагай [рre] .... [/рre]
| |
|
|
|
|