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

| Страницы: (3) [1] 2 3 все ( Перейти к последнему сообщению ) |
Генерация случайных чисел
|
Сообщ.
#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
,
|
|
|
|
методов генерации последовательности псевдослучайных чисел очень много:)
![]() у нас по ним счас как раз курс читается (ну почти по ним)если интересуует могу доку зафигачить:) еще в тему: есть работы по генеррации таких чисел на основании шума, полученного от микрофона звуковухи. и есть какая-то мелкософтовская фича для получения числа основываясь на температуре проца (которая до десятитысячных считается) только этот очень медленный способ |