Клубове Дир.бг
powered by diri.bg
търси в Клубове diri.bg Разширено търсене

Вход
Име
Парола

Клубове
Dir.bg
Взаимопомощ
Горещи теми
Компютри и Интернет
Контакти
Култура и изкуство
Мнения
Наука
Политика, Свят
Спорт
Техника
Градове
Религия и мистика
Фен клубове
Хоби, Развлечения
Общества
Я, архивите са живи
Клубове Дирене Регистрация Кой е тук Въпроси Списък Купувам / Продавам 21:41 07.07.25 
Компютри и Интернет
   >> Програмисти
*Кратък преглед

Тема Как да...нови  
Автор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 !



Тема Re: Как да...нови [re: Philip]  
Автор lnfoMatic (непознат )
Публикувано26.04.01 17:21



Значи можеш да опиташ следното: искаш да изкараш всички числа от 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]




*Кратък преглед
Клуб :  


Clubs.dir.bg е форум за дискусии. Dir.bg не носи отговорност за съдържанието и достоверността на публикуваните в дискусиите материали.

Никаква част от съдържанието на тази страница не може да бъде репродуцирана, записвана или предавана под каквато и да е форма или по какъвто и да е повод без писменото съгласие на Dir.bg
За Забележки, коментари и предложения ползвайте формата за Обратна връзка | Мобилна версия | Потребителско споразумение
© 2006-2025 Dir.bg Всички права запазени.