Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.06.2013, 00:09   #11
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Цитата:
1) Не совсем ясно зачем на каждой итерации цикла инициализировать ГПСЧ? ИМХО это делается 1 раз за всю программу
Randomize генерирует случайное число на основе GetTickCount и записывает в переменную RandBase.
Сам же Random и все что от него, использует это число как точку старта, что-то в стиле:
(GetTickCount-RandBase)*$0FDD...(лень смотреть на что умножается).

И ежу понятно, что изменяя RandBase мы уменьшаем шанс выпадения того же числа ещё раз в следующим 2 и более вызовах.

Чем меньше постоянных величин, тем меньше шанс повторения того же числа.
Если вызывать Randomize 1 раз, то постоянных величины в последующем - 2, это RandBase и $0FDD...(лень смотреть на что умножается), если много, то постоянная величина всего 1.

Последний раз редактировалось Человек_Борща; 14.06.2013 в 00:12.
Человек_Борща вне форума Ответить с цитированием
Старый 14.06.2013, 00:47   #12
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Человек_Борща, к сожалению, это всё ваши мечты..
Вы не только уменьшаете шанс выпадения одного и того же числа, Вы постоянным вызовом в цикле Randomize НИВЕЛИРУЕТЕ работу полиноминальной функции.
Зачем Вам в таком случае вообще Random - умножайте GetTickCount на константу. Будете получать то, что Вы и получаете. (и, думаю, что характеристики полученных "псевдослучайных" чисел будут НАМНОГО хуже, чем полученные в результате стандартного random'а!

всё вышесказанное является моим личным (субъективным) мнением и ни в коем разе не претендует на истину в последней инстанции

Если же вернуться к исходной теме (хотя автору топика всё это, судя по всем давно не нужно!), то существует всего два рабочих способа/алгоритм получить набор данных с гарантией неповторения:
- запоминать все выпавшие значения и на каждом шаге цикла сравнивать очередное случайное число с выпавшими ранее
- заполнить массив неповторяющимися числам (можно прямо подряд), правильно его перемешать (на форуме неоднократно рассказывалось, как правильно тасовать числа с пруфлинком), потом просто брать числа из перемешанного массива по одному.

опять таки, оба этих способа неоднократно обсуждались на форуме, и, очевидно, что выбор того или иного способа явно зависит от конкретной задачи (ну, например, если есть база на 60000 тыс.слов и нужно достать из неё 100 случайных неповторяющихся слов, то желательно брать первый алгоритм, а если дана колода карт и нужно реализовать игру в "21", то нужно брать второй алгоритм (первый в данном случае не подходит, по крайней мере, без модификаций)..

Последний раз редактировалось Serge_Bliznykov; 14.06.2013 в 00:51.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.06.2013, 01:22   #13
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Я не на пустом месте это говорю.
Практика показывает:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  Randomize;
  Memo1.Lines.Clear;
  for i := 0 to 6 do
    Memo1.Lines.Add(IntToStr(Random(10)));
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  i: Integer;
begin
  Memo2.Lines.Clear;
  for i := 0 to 6 do
  begin
    Randomize;
    Memo2.Lines.Add(IntToStr(Random(10)));
  end;
end;
Что при Button1, большее кол-во чисел имеет повторы, например 2 тройки и 3 нуля за 1 раз.
При Button2, редко бывают повторы у нескольких чисел сразу, и проскакивают повторы 1 и того же числа.
Человек_Борща вне форума Ответить с цитированием
Старый 14.06.2013, 08:55   #14
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

во-первых, ну какую статистику Вы наберете за 6 испытаний?!?!
Сделайте хотя бы 60 тысяч, тогда будет повод для разговора.

во-вторых, я же говорю, напишите просто умножение TickCount на константу - для ваших 6 чисел получите, что "вроде бы" случайные числа стали лучше, меньше повторяются. Вы понимаете о чём я толкую?



p.s.
кстати, попробуйте такой код:
Код:
  for i := 0 to 6 do begin
    sleep(20);
    Application.ProcessMessages;
    Memo1.Lines.Add(IntToStr(Random(10)));
  end;

Последний раз редактировалось Serge_Bliznykov; 14.06.2013 в 09:01.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
инициализация массива, вывод массива и обработка массива должны быть реализованы с помоshью функций airesjke Помощь студентам 0 02.03.2012 16:14
Вывод значений элемента массива в delphi Artem_host Общие вопросы Delphi 3 11.02.2012 21:29
Вывод двумерного массива на экран. (Delphi) Refon_S Помощь студентам 3 21.12.2011 23:30
Задача о напечатании повторно рандомных символов XanderXage Помощь студентам 2 12.10.2011 20:18
Прописание рандомных ссылок к картинкам. Averin PHP 1 03.10.2011 18:38