Генерация случайных чисел
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.217.37] |
|
|
правила раздела Алгоритмы

Генерация случайных чисел
|
Сообщ.
#1
,
|
|
|
|
Тут вдруг захотелось сделать генератор (псевдо)случайных чисел.
Подумал, и понял, что абсолютно не знаю (даже не представляю), КАК заставить комп выбрать случайное число, например, в промежутке от 0 до 10... ![]() Но от этого стало еще интереснее... ![]() Мож кто знает алгоритм генератора случ. чисел?.. или какие-нить мысли?.. |
|
Сообщ.
#2
,
|
|
|
|
Равномеpное pаспpеделение от 0 до 1. Метод вычетов. Он же метод Лемеpа.
=== Cut === struct time t; // стpyктypа вpемени static long x; // для генеpатоpа //---------------------------------------------------------------------------- // Инициализация генеpатоpа слyчайных чисел double Randomize() { gettime(&t); x=t.ti_sec; } //---------------------------------------------------------------------------- // Генеpатоp слyчайных чисел double Rnd() { const a=13; const c=15; const long M=32768; x=(a*x+c)\%M; return (double)x/M; } === Cut === Можешь поигpаться с константами... |
|
Сообщ.
#3
,
|
|
|
|
А можно в 2х словах поподробней?..
Я так понял, просто за переменную Х берецца значение секунд в данный момент и дальше по формуле... |
|
Сообщ.
#4
,
|
|
|
|
В общем, тебе нужно оттолкнуться хоть от чего-то, что невозможно предсказать. Скажем, невозможно предсказать, в какой момент юзер запустит твою прогу, и когда она дойдёт до куска кода, который генерит "псевдо"-случайное число. Невозможно предсказать, что происходит в помещении, где сидит юзер, поэтому можно записать что-нибудь со звуковой карты (но это уже на крайний случай), посчитать хеш от этих данных и пользовать как случайное число. Короче, варианты есть..
|
|
Сообщ.
#5
,
|
|
|
|
Берешь несколько указателей.
Передвигаешь их на значение текущего времени в любую сторону. Читаешь что там есть. Так пару раз. Все это суммируешь, возводишь в куб, берешь остаток от деления на 53. сдвигаешь на текущую дату в зависимости от времени суток. Берешь логарифм по основаниню 5.3 Перешь целую часть. И.т.д. пока не закончится воображение. Но в любом случае случайной величины ты не получишь. Можно конечно заставить юзера подергать мышь, и постучать по клаве, как в ПЖП. Тога будут действительно случайные велечины. А с ними можно для верности провести все вышеперечисленое. Удачи. P.S. а вышеприведенный генератор выдает всего 60 различных последовательностей. |
|
Сообщ.
#6
,
|
|
|
|
Спасиба, буду пробовать... :)
|
|
Сообщ.
#7
,
|
|
|
|
Цитата Muran, 03.05.02, 23:23:48 Можно конечно заставить юзера подергать мышь, и постучать по клаве, как в ПЖП. Тога будут действительно случайные велечины. Точнее было раньше: Цитата Но в любом случае случайной величины ты не получишь. Подумай - что за распределение будет у такой юзеровской случайной величины - у большинства генераторов и то лучше. Тем более, человек произвольно не способен генерировать равномерно-распределенные (равномерно - здесь - с каким-нибудь приличным распределением - нормальным, например) - не помню где, видел ссылку на программу, предсказывающую "случайный" выбор человека с вероятностью больше обычной (т.е. для выбора из двух значений, вероятность угадывания приближается к 0,5 только если человек пользуется внешним генератором и становится больше 0,5, если человек пытается брать числа "из головы") |
|
Сообщ.
#8
,
|
|
|
|
#include <stdlib.h>
#include <stdio.h> #include <time.h> void main( void ) { int i; srand( (unsigned)time( NULL ) ); printf( " - \%d\n - ", rand()\%10); } Так не годиться? |
|
Сообщ.
#9
,
|
|
|
|
2Faust
А какая разница по какому закону распределяется? человеческое распредление величины гауссово, так ведь линейную то виг сделаешь. Их и в природе не бывает. |
|
Сообщ.
#10
,
|
|
|
|
Цитата Muran, 04.05.02, 11:32:34 ...человеческое распредление величины гауссово... ::)Напоминает "Кесарю - кесарево..." или "сочти это число, ибо это число человеческое..." Я к тому, что псевдослучайность - единственное, что доступно человеку, standalone - без помощи наблюдения за природой. |
|
Сообщ.
#11
,
|
|
|
|
Люди атас !!! срочно нужен генератор сл чисел для глобальных переменных .... помогите если сможете .Заранее спасибо :
|
|
Сообщ.
#12
,
|
|
|
|
А еще - Д. Кнут "Искусство программирования", том 2. Там целая глава посвящена генерации псевдослучайных последовательностей.
|
|
Сообщ.
#13
,
|
|
|
|
Разница какой тип распределения в том, что:
1. Если вы хотите смоделировать как упадет монетка то вам нужно равномерное распределение. Т.е. событие "решко" должно иметь ту же вероятность произойти, что и событие "орел". 2. Если вы хотите предсказать отказ устройства то вам понадобится экспонециальное распределение. 3. В мат. статистике и термодинамике часто используют нормальное распределение ну так далие. Но все распределения можно сгенерировать с помощью равномерно распределенной случайной величины. Что же касается алгоритма то можно посоветовать метод середины квадрата: X(n) = 0,A(1) A(2) ... A(2k) X(n)^2 = 0,B(1) B(2) ... B(4k) X(n+1) = 0,B(k+1) ...B(3k) |
|
Сообщ.
#14
,
|
|
|
|
Господа, очень интересно было бы увидеть код Метода вычетов (он же метод Лемера) на языке Delphi. Кто-нибудь сможет помочь? Спасибо.
|
|
Сообщ.
#15
,
|
|
|
|
методов генерации последовательности псевдослучайных чисел очень много:)
![]() у нас по ним счас как раз курс читается (ну почти по ним)если интересуует могу доку зафигачить:) еще в тему: есть работы по генеррации таких чисел на основании шума, полученного от микрофона звуковухи. и есть какая-то мелкософтовская фича для получения числа основываясь на температуре проца (которая до десятитысячных считается) только этот очень медленный способ |
|
Сообщ.
#16
,
|
|
|
|
Цитата kozza, 22.03.03, 11:36:31 Господа, очень интересно было бы увидеть код Метода вычетов (он же метод Лемера) на языке Delphi. Кто-нибудь сможет помочь? Спасибо. Если я правильно помню, то алг. Леммера выглядит так: R(n)=(R(n-1)*a)\%m; m - фактически период генератора, желательно - простое число. а - тоже чего-то значит, не помню точно что. Я пробовала, получается довольно красивое равномерное распрделение |
|
Сообщ.
#17
,
|
|
|
|
дорогой лучше КНУТа тебе никто не скажет
![]() Не помню в котором томе - но тебе нужно хорошенько покопаться. |
|
Сообщ.
#18
,
|
|
|
|
Кстати, для проверки - хорош или нет генератор случайных чисел, можно использовать
визуальный графический метод. Вывод каждой пары значений RND на экран в цикле. Лучше всего в диапазоне 0...100( т.е. от RND берется два знака). прим.: лично опробовал многие RNDшки, но равномерного распределения точек практически нигде небыло... Тут большое поле для экспериментов... |
|
Сообщ.
#19
,
|
|
|
|
Цитата Ruben, 24.03.03, 00:24:52 дорогой лучше КНУТа тебе никто не скажет ![]() Не помню в котором томе - но тебе нужно хорошенько покопаться. 1) во втором томе никто не скажет? из этого ничего не следует надо не сказать хорошо а обЪяснить понятно две разные вещи самым удачным и в то же время не доказанным считается использование цифр трансцендентных чисел например цифры числа пи - хорошая бесконечная случ послндовательность да вот еще не любое распределение можно сгеперировать из равномерного в частности те распределения у которых нет мат.ожидания с уважением |
|
Сообщ.
#20
,
|
|
|
|
Цитата esperanto, 25.03.03, 20:49:20 в частности те распределения у которых нет мат.ожидания а что, УЖЕ И ТАКИЕ ПОЯВИЛИСЬ?????????????????????7 |
|
Сообщ.
#21
,
|
|
|
|
All, кому надо - ловите исходник randoma
переменная seed инициализируется до вызова функции. Таймером, к примеру. ![]() ![]() <br>random proc<br> push bx<br> mov ax,seed<br> mov cx,8<br>newbit:<br> mov bx,ax<br> and bx,002Dh<br> xor bh,bl<br> clc<br> jpe shift<br> stc<br>shift:<br> rcr ax,1<br> loop newbit<br> mov seed,ax<br> xor ah,ah<br> pop bx<br> ret<br>seed dw ?<br>random endp<br> |
|
Сообщ.
#22
,
|
|
|
|
Цитата wormball, 28.03.03, 18:19:35 а что, УЖЕ И ТАКИЕ ПОЯВИЛИСЬ?????????????????????7 а как же например распределение Коши |
|
Сообщ.
#23
,
|
|
|
|
Цитата esperanto, 29.03.03, 19:19:59 а как же например распределение Коши к твоему сведению, у него бесконечна дисперсия, а математическое ожидание у него 0. к тому же и его можно запросто сгенерировать, правда только в диапазоне extended (aka long double) ;D ;D ;D. |
|
Сообщ.
#24
,
|
|
|
|
integral (x/(1+x^2),0,00)=integral(d(x^2+1)/(x^2+1),0,00)=ln(x^2+1),0,00)==00
tak 4to u4ite terber i ne umni4ajte |
|
Сообщ.
#25
,
|
|
|
|
я тут на досуге даже придумал, как из одного распределения получить другое. хотя никто вроде не высказывал желания его узнать, а я всё равно напишу.
пусть у нас есть случайная величина х, распределённая по закону g(x). надо найти такую функцию у=у(х), чтобы она была распределена по закону f(y). вероятность dP = f(y)dy = g(x)dx проинтегрируем F(y)=G(x)+c y=F^-1(G(x)+c), где с - произвольная постоянная. |
|
Сообщ.
#26
,
|
|
|
|
я думаю проблема в нахождении обратных функций!??
|
|
Сообщ.
#27
,
|
|
|
|
Цитата esperanto, 01.04.03, 18:05:43 я думаю проблема в нахождении обратных функций!?? ну это смотря какова прямая функция. например нормальное распределение вообще нельзя проинтегрировать аналитически, а в случае с коши там будет нечто вроде тангенса. с другой стороны как интегралы, так и обратные функции можно взять численно ;D проблема в том, что там будут очень большие значения производных |
|
Сообщ.
#28
,
|
|
|
|
Мне тут задали написать три разных генераторов случайных чисел. Не подскажете как?
|
|
Сообщ.
#29
,
|
|
|
|
Народ...подскажите как всетки пользоваться этим генератором случайных чисел??
Позарез надо(((( |
|
Сообщ.
#30
,
|
|
|
|
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/CODES/mt19937ar.c
Признанный во всём мире генератор с примером использования. |
|
Сообщ.
#31
,
|
|
|
|
Цитата gena_dj @ http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/CODES/mt19937ar.c Признанный во всём мире генератор с примером использования. Во-всем мире он не признан. |