Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Уникальное случайное значение

263
09 мая 2007 года
koltaviy
816 / / 16.12.2004
Ситуация следующая:
1) Использую переменную RandSeed и функцию RandomRange( int, int ).
2) В Help'е написано, что для генерации случайного значения для статистических нужд нужно именно их и использовать, т.к. они дают уникальное случайное значение, иначе вместо RandSeed использовать Randomize().
3) Пишу:
 
Код:
RandSeed = MilliSecondOfTheDay( Now() );    //можно GetTickCount() - кому как нравится.
int rnd_figure = RandomRange( 0, 100 );
 
//ну и можно так, для наглядности
ShowMessage(  IntToStr( rnd_figure )  );

В общем получается, что нормальный ГСЧ, должен генерить 100 уникальных чисел, и только потом числа опять начнут повторяться( что логично ).
У меня же получается совсем другое - что и так понятно - числа повторяются.

Подскажите кто, чем может.
Естественно, не откажусь от чистых C++ решений. Использую эти операторы только по причине того, что о них написано в Help'е( что написано - смотрите выше ).
Одна оговорка - видел решения на чистом C++ с генерацией ун. случайных чисел для заполнениями ими в массив. Для этого использовалась простая проверка на существующие уже такое значение в массиве - и если оно существует - происходит повторная генерация. Этот вариант мне не подходит - не известно заранее сколько именно чисел придется генерить - известно только, что меньшее, чем указано в параметрах функции ГСЧ; а использование контейнеров для данных целей - по-моему глупая затея!
294
09 мая 2007 года
Plisteron
982 / / 29.08.2003
Цитата: koltaviy
Ситуация следующая:
1) Использую переменную RandSeed и функцию RandomRange( int, int ).
2) В Help'е написано, что для генерации случайного значения для статистических нужд нужно именно их и использовать, т.к. они дают уникальное случайное значение, иначе вместо RandSeed использовать Randomize().
3) Пишу:
 
Код:
RandSeed = MilliSecondOfTheDay( Now() );    //можно GetTickCount() - кому как нравится.
int rnd_figure = RandomRange( 0, 100 );
 
//ну и можно так, для наглядности
ShowMessage(  IntToStr( rnd_figure )  );

В общем получается, что нормальный ГСЧ, должен генерить 100 уникальных чисел, и только потом числа опять начнут повторяться( что логично ).
У меня же получается совсем другое - что и так понятно - числа повторяются.

Подскажите кто, чем может.
Естественно, не откажусь от чистых C++ решений. Использую эти операторы только по причине того, что о них написано в Help'е( что написано - смотрите выше ).
Одна оговорка - видел решения на чистом C++ с генерацией ун. случайных чисел для заполнениями ими в массив. Для этого использовалась простая проверка на существующие уже такое значение в массиве - и если оно существует - происходит повторная генерация. Этот вариант мне не подходит - не известно заранее сколько именно чисел придется генерить - известно только, что меньшее, чем указано в параметрах функции ГСЧ; а использование контейнеров для данных целей - по-моему глупая затея!



Посмотри здесь. Ещё есть вот такая ПДФочка.
И, наконец, ГПСЧ, которым я пользовался (правда, текст на Васике, уж не обессутьте, но на плюса перевести, думаю, будет несложно). Привожу as is.

Код:
10 M=8192:D=67101323
20 B=M*M
30 PRINT:PRINT:PRINT"Генерирование высококачественных псевдослучайных чисел"
40 PRINT:INPUT"Введите длину серии";N
50 PRINT:PRINT"Введите начальное число (от 1 до)";D-1;")":INPUT S
60 R=S
70 FOR I=1 TO N
80 C=INT(R/M)
90 R=B*C+M*(R-M*C)
100 IF R>D THEN R=R-D
110 PRINT R,R/D
120 NEXT I
130 PRINT:PRINT"Начальное число =";S:PRINT"Конечное число =";R
140 GOTO 30
150 END

(c) Дж. Теннат-Смит, "Бейсик для статистиков", М:Мир, 1988б ISBN 5-03-000725 ББК 32.97+22.172 Т33 УДК 681.322-185.4+519.22/.25
7.8K
09 мая 2007 года
Hrew
185 / / 23.04.2007
Цитата: koltaviy
В общем получается, что нормальный ГСЧ, должен генерить 100 уникальных чисел, и только потом числа опять начнут повторяться( что логично )


Ну вообще-то не совсем так. "Нормальный ГСЧ" гарантирует, что в некоторых пределах не будут повторяться последовательности чисел. Но это совсем не значит, что если Вы генерируете 100 случайных чисел, то все они будут различны. Задача генератора - обеспечить нормальное распределение этих чисел, и только.

Если необходимо получить 100 различных чисел, то нужно писать свою функцию для генерации, учитывающую условие уникальности.

263
09 мая 2007 года
koltaviy
816 / / 16.12.2004
To Plisteron:
Спасибо! Очень помог. Добавил бы тебе "галочку", да уже когда-то добавлял!! Так что мажь мое "спасибо" на хлеб. ;)
To Hrew:
Тоже спасибо за пояснения. Borland меня обманул. ;)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог