Текущий архив: 2002.12.19;
Скачать: CL | DM;
Вниз
Алгоритм случайных чисел Найти похожие ветки
← →
ZMaxim (2002-09-14 17:09) [0]Уважаемые мастера, очень нужен алгоритм случайных чисел, подскажите как написать или где взять. Заранее благодарен.
← →
lobity (2002-09-14 17:26) [1]Знаешь такой оператор - Randomize? Если тебя интересует алгоритм написания: Работай со временем, датой, складывай, вычитай, дели и т. п. и т. д.
← →
Anatoly Podgoretsky © (2002-09-14 18:02) [2]Стандартные по какой то причине не устраивают?
Ну тогда тебе в проект UBFPD
← →
NetBreaker666 © (2002-09-14 22:02) [3]использую GetTickCount + random + кол-во тактов процессора (начиная с MMX)
← →
Just_user_x (2002-09-15 13:44) [4]/*
C This random number generator originally appeared in "Toward a Universal
C Random Number Generator" by George Marsaglia and Arif Zaman.
C Florida State University Report: FSU-SCRI-87-50 (1987)
C
C It was later modified by F. James and published in "A Review of Pseudo-
C random Number Generators"
C
C THIS IS THE BEST KNOWN RANDOM NUMBER GENERATOR AVAILABLE.
C (However, a newly discovered technique can yield
C a period of 10^600. But that is still in the development stage.)
C
C It passes ALL of the tests for random number generators and has a period
C of 2^144, is completely portable (gives bit identical results on all
C machines with at least 24-bit mantissas in the floating point
C representation).
C
C The algorithm is a combination of a Fibonacci sequence (with lags of 97
C and 33, and operation "subtraction plus one, modulo one") and an
C "arithmetic sequence" (using subtraction).
C========================================================================
This C language version was written by Jim Butler, and was based on a
FORTRAN program posted by David LaSalle of Florida State University.
*/
#include <stdio.h>
#include <stdlib.h>
#define TRUE -1
#define FALSE 0
#define boolean int
static void rmarin(int ij, int kl);
void ranmar(float rvec[], int len);
void main()
{
float temp[101];
int ij, kl, len, i;
/* random seeds for the test case: */
ij = 1802;
kl = 9373;
/* do the initialization */
rmarin(ij,kl);
/* generate 20,000 random numbers */
len = 100;
for (i=1; i<=200; i++)
ranmar(temp, len);
/*
C If the random number generator is working properly, the next six random
C numbers should be:
C 6533892.0 14220222.0 7275067.0
C 6172232.0 8354498.0 10633180.0
*/
len = 6;
ranmar(temp,len);
for (i=1; i<=6; i++)
printf("%12.1f ", 4096.0*4096.0*temp[i]);
}
static float u[98], c, cd, cm;
static int i97, j97;
static boolean test = FALSE;
static void rmarin(ij,kl)
int ij, kl;
{
/*
C This is the initialization routine for the random number generator RANMAR()
C NOTE: The seed variables can have values between: 0 <= IJ <= 31328
C 0 <= KL <= 30081
C The random number sequences created by these two seeds are of sufficient
C length to complete an entire calculation with. For example, if sveral
C different groups are working on different parts of the same calculation,
C each group could be assigned its own IJ seed. This would leave each group
C with 30000 choices for the second seed. That is to say, this random
C number generator can create 900 million different subsequences -- with
C each subsequence having a length of approximately 10^30.
C
C Use IJ = 1802 & KL = 9373 to test the random number generator. The
C subroutine RANMAR should be used to generate 20000 random numbers.
C Then display the next six random numbers generated multiplied by 4096*4096
C If the random number generator is working properly, the random numbers
C should be:
C 6533892.0 14220222.0 7275067.0
C 6172232.0 8354498.0 10633180.0
*/
int i, j, k, l, ii, jj, m;
float s, t;
if (ij<0 || ij>31328 || kl<0 || kl>30081) {
puts("The first random number seed must have a value between 0 and 31328.");
puts("The second seed must have a value between 0 and 30081.");
exit(1);
}
i = (ij/177)%177 + 2;
j = ij%177 + 2;
k = (kl/169)%178 + 1;
l = kl%169;
for (ii=1; ii<=97; ii++) {
s = 0.0;
t = 0.5;
for (jj=1; jj<=24; jj++) {
m = (((i*j)%179)*k) % 179;
i = j;
j = k;
k = m;
l = (53*l + 1) % 169;
if ((l*m)%64 >= 32) s += t;
t *= 0.5;
}
u[ii] = s;
}
c = 362436.0 / 16777216.0;
cd = 7654321.0 / 16777216.0;
cm = 16777213.0 / 16777216.0;
i97 = 97;
j97 = 33;
test = TRUE;
}
void ranmar(rvec, len)
float rvec[]; /* len random numbers are placed in rvec[1..len] */
int len;
/*
C This is the random number generator proposed by George Marsaglia in
C Florida State University Report: FSU-SCRI-87-50
C It was slightly modified by F. James to produce an array of pseudorandom
C numbers.
*/
{
int ivec;
float uni;
if (test==FALSE) {
puts("Call the init routine rmarin() before calling ranmar().");
exit(2);
}
for (ivec=1; ivec<=len; ivec++) {
uni = u[i97] - u[j97];
if (uni < 0.0) uni += 1.0;
u[i97] = uni;
i97--;
if (i97==0) i97 = 97;
j97--;
if (j97==0) j97 = 97;
c -= cd;
if (c<0.0) c += cm;
uni -= c;
if (uni<0.0) uni += 1.0;
rvec[ivec] = uni;
}
}
← →
Just_user_x (2002-09-15 13:48) [5]Вообще-то можно поискать на www.torry.net. Если не ошибаюсь, что-то там проявлялось по данному вопросу, с исходниками.
← →
Just_user_x (2002-09-15 14:29) [6]Точно!
===
Идем на Search, в строке запроса набираем: Random. Смотрим результат и выбираем. Вот некоторые ссылки:
То что выше, но на Pascal
- http://www.torry.net/vcl/science/other/rmar.zip
еще:
- http://www.torry.net/vcl/science/statistic/amrandomx.zip
← →
- Lazure - (2002-09-15 23:35) [7]
RandSeed dd 0
RandSave DW 0
Randomize Proc
mov ah,2Ch
int 21h
mov Word ptr cs:[RandSeed],cx
mov Word ptr cs:[RandSeed+2],dx
ret
Randomize endP
; In: AX - Range
; Out: AX - Value within 0 through AX-1
Random proc
PUSHA
mov cx,ax ; save limit
mov ax,Word ptr cs:[RandSeed+2]
mov bx,Word ptr cs:[RandSeed]
mov si,ax
mov di,bx
mov dl,ah
mov ah,al
mov al,bh
mov bh,bl
xor bl,bl
rcr dl,1
rcr ax,1
rcr bx,1
add bx,di
adc ax,si
add bx,62e9h
adc ax,3619h
mov word ptr cs:[RandSeed],bx
mov word ptr cs:[RandSeed+2],ax
xor dx,dx
div cx
mov CS:[RANDSAVE],dx ; return modulus
POPA
MOV AX,CS:[RANDSAVE]
ret
Random EndP
а вот насчет Int21h - надо наверно еще подумать...
← →
Mystic © (2002-09-16 00:02) [8]Несколько генераторов RND от Д. Кнута:
http://www-cs-faculty.stanford.edu/~knuth/programs/rng-double.c
http://www-cs-faculty.stanford.edu/~knuth/programs/rng.c
Об основах построения ГСЧ можно почитать у него же, только использовать их имеет смысл только в сверх-научных приложениях, либо в исследовательских целях.
← →
Ketmar © (2002-09-17 16:33) [9]берем Mersenne Twister и наслаждаемся. почему Мерзен? а имя нравится %-))
Satanas Nobiscum! 17-Sep-XXXVII A.S.
← →
Losyara (2002-09-18 11:50) [10]Все эти алгоритмы гавно полное. Особенно Randomize. Лучшее решение - это написать самому. Даже у Кнута они слабоваты. Но в принципе если ты решаешь не математическую задачу, то тебе должно быть по барабану.
← →
Ketmar © (2002-09-18 12:44) [11]2Losyara:
однако, тут, оказывается, есть крутейшие математики. Кнут что? дерьмо ваш Кнут. тупица. бездарь. а вот Я!
продемонстрировать ваш крутой алгоритм с соотв. математическими доказательствами не хотите?
для справки: Randomize - это не алгоритм. и даже случайное число не генерирует. слечайное число генерирует функция Random() %-)
Satanas Nobiscum! 18-Sep-XXXVII A.S.
← →
Poirot © (2002-09-18 21:34) [12]Бла-бла-бла!!!
Математик это еще не то слово!!! Доживите до такой известности, а потом говорите!!!
← →
sancho © (2002-09-25 22:22) [13]А по-моему
.....
var
x:real;
.....
begin
randomize;
x:=random;
end;
← →
Ru © (2002-10-17 17:49) [14]>Losyara (18.09.02 11:50)
можно обойтись без всех этих алгоритмов в более-менее простом случае. Есть ситуации когда алгоритмов мало!
← →
Sharik_212 (2002-10-17 18:45) [15]Если дело не идет о серьезной криптографии, то в принципе можно довольствоваться стандартными функциями Random(n). Перегенерить можно с помощью Randomize. "Ручками" установить "начало" генерации - RandSeed:=[любое из Intrger]
Страницы: 1 вся ветка
Текущий архив: 2002.12.19;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.013 c