Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Разное > Исходники и статьи
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 23.07.2013, 13:09
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию Генератор Парка-Миллера (C Source)

Генератор случайных чисел по алгоритму Парка-Миллера.
По заверениям дает белый шум.

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include <stdio.h>
 
/* Minimal portable random generator by Park and Miller */
 
/* Lewis-Goodman-Miller constants */
#define IA 16807
#define IM 2147483647
#define AM (1./IM)
/* Scharge constants */
#define IQ 12773
#define IR 2836
#define NTAB 32
#define NWUP 8
#define NDIV (1+(IM-1)/NTAB)
#define EPS 1.2e-7
#define RNMX (1.0-EPS)
/* Special mask to be explained below */
#define MASK 123456789
 
static long dummy;
 
/* initial seed, for all the generators here */
void Seed(long dum) {
    dummy = dum;
}
 
/* returns random uniformly distributed between 0 and 1 */
float unirand0(void) {
    long k;
    float ans;
     
    dummy ^= MASK;  /* avoid dummy==0 */
    k = dummy / IQ;
     
    if ((dummy=IA*(dummy-k*IQ)-IR*k)<0)
        dummy += IM;
         
    ans = AM * dummy;
     
    dummy ^= MASK;  /* restore unmasked dummy */
     
    return(ans);
}
 
float unirand1(void) {
    int j;
    long k;
    static long iy=0,iv[NTAB];
    float temp;
     
    /* initialize */
    if (dummy <= 0 || !iy) {
        /* avoid negative or zero seed */
        if (dummy < 0) dummy =- dummy; else
        if (dummy == 0) dummy = 1;
         
        /* after NWUP warmups, initialize shuffle table */
        for(j = NTAB + NWUP - 1; j >= 0; j--) {
            k = dummy / IQ;
             
            if ((dummy = IA * (dummy - k * IQ) - IR * k) < 0)
                dummy += IM;
                 
            if (j < NTAB)
                iv[j] = dummy;
        }
         
        /* first specimen from the table */
        iy=iv[0];
    }
     
    /* regular work: generate new number */
    k = dummy / IQ;
    if ((dummy = IA * (dummy - k * IQ) - IR * k) < 0)
        dummy += IM;
         
    /* shuffle output */
    iy = iv[j = iy / NDIV];
    iv[j] = dummy;
     
    /* return */
    if ((temp = AM * iy) > RNMX)
        return(RNMX);
    else
        return(temp);
}
 
void main(){
    int i;
    Seed(6723);
    for (i = 0; i < 100; i++)
        printf("%f\n", unirand1());
}
>>bcc32 parkmiller.c

З.Ы. Код не совсем нормализован, некоторые места можно сократить.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию

Последний раз редактировалось M.A.D.M.A.N., 23.07.2013 в 15:47.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:08.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025