RandSeed = MilliSecondOfTheDay( Now() ); //можно GetTickCount() - кому как нравится.
int rnd_figure = RandomRange( 0, 100 );
//ну и можно так, для наглядности
ShowMessage( IntToStr( rnd_figure ) );
Уникальное случайное значение
1) Использую переменную RandSeed и функцию RandomRange( int, int ).
2) В Help'е написано, что для генерации случайного значения для статистических нужд нужно именно их и использовать, т.к. они дают уникальное случайное значение, иначе вместо RandSeed использовать Randomize().
3) Пишу:
Код:
В общем получается, что нормальный ГСЧ, должен генерить 100 уникальных чисел, и только потом числа опять начнут повторяться( что логично ).
У меня же получается совсем другое - что и так понятно - числа повторяются.
Подскажите кто, чем может.
Естественно, не откажусь от чистых C++ решений. Использую эти операторы только по причине того, что о них написано в Help'е( что написано - смотрите выше ).
Одна оговорка - видел решения на чистом C++ с генерацией ун. случайных чисел для заполнениями ими в массив. Для этого использовалась простая проверка на существующие уже такое значение в массиве - и если оно существует - происходит повторная генерация. Этот вариант мне не подходит - не известно заранее сколько именно чисел придется генерить - известно только, что меньшее, чем указано в параметрах функции ГСЧ; а использование контейнеров для данных целей - по-моему глупая затея!
Цитата: koltaviy
Ситуация следующая:
1) Использую переменную RandSeed и функцию RandomRange( int, int ).
2) В Help'е написано, что для генерации случайного значения для статистических нужд нужно именно их и использовать, т.к. они дают уникальное случайное значение, иначе вместо RandSeed использовать Randomize().
3) Пишу:
В общем получается, что нормальный ГСЧ, должен генерить 100 уникальных чисел, и только потом числа опять начнут повторяться( что логично ).
У меня же получается совсем другое - что и так понятно - числа повторяются.
Подскажите кто, чем может.
Естественно, не откажусь от чистых C++ решений. Использую эти операторы только по причине того, что о них написано в Help'е( что написано - смотрите выше ).
Одна оговорка - видел решения на чистом C++ с генерацией ун. случайных чисел для заполнениями ими в массив. Для этого использовалась простая проверка на существующие уже такое значение в массиве - и если оно существует - происходит повторная генерация. Этот вариант мне не подходит - не известно заранее сколько именно чисел придется генерить - известно только, что меньшее, чем указано в параметрах функции ГСЧ; а использование контейнеров для данных целей - по-моему глупая затея!
1) Использую переменную RandSeed и функцию RandomRange( int, int ).
2) В Help'е написано, что для генерации случайного значения для статистических нужд нужно именно их и использовать, т.к. они дают уникальное случайное значение, иначе вместо RandSeed использовать Randomize().
3) Пишу:
Код:
RandSeed = MilliSecondOfTheDay( Now() ); //можно GetTickCount() - кому как нравится.
int rnd_figure = RandomRange( 0, 100 );
//ну и можно так, для наглядности
ShowMessage( IntToStr( rnd_figure ) );
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
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
Цитата: koltaviy
В общем получается, что нормальный ГСЧ, должен генерить 100 уникальных чисел, и только потом числа опять начнут повторяться( что логично )
Ну вообще-то не совсем так. "Нормальный ГСЧ" гарантирует, что в некоторых пределах не будут повторяться последовательности чисел. Но это совсем не значит, что если Вы генерируете 100 случайных чисел, то все они будут различны. Задача генератора - обеспечить нормальное распределение этих чисел, и только.
Если необходимо получить 100 различных чисел, то нужно писать свою функцию для генерации, учитывающую условие уникальности.
Спасибо! Очень помог. Добавил бы тебе "галочку", да уже когда-то добавлял!! Так что мажь мое "спасибо" на хлеб. ;)
To Hrew:
Тоже спасибо за пояснения. Borland меня обманул. ;)