Re[5]: Функция random()
От: Дмитро  
Дата: 28.04.03 02:14
Оценка: 10 (1)
Здравствуйте, adontz, Вы писали:

A>Здравствуйте, Дмитро, Вы писали:


Д>Я бы сделал так:

Д>
Д>long randtwice() {
Д>     return rand()*MAX_RAND+rand();
Д>}
Д>


A>Ты скоратил повторяемость в 2 раза,


Да, но только в том случае, если период -- четное число. А для того, чтобы сделать период нечетным, достаточно выбросить из рассмотрения какое-нибудь случайное число (просто пропускать его при генерации). При этом период уменьшится только на единицу.

--
Дмитрий
--
Дмитрий
Re[3]: Функция random()
От: Дмитро  
Дата: 26.04.03 12:43
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Дмитро, Вы писали:


А>А как заставить её генерить числа больше чем 7fff? Переоределиение MAX_RAND не помогло.


Я бы сделал так:
long randtwice() {
     return rand()*MAX_RAND+rand();
}


--
Дмитрий
--
Дмитрий
Функция random()
От: artgonch  
Дата: 26.04.03 02:44
Оценка:
Извините за глупыфй вопрос. Не могу найти, в каком заголовке (VC++ 6.0) описаны функции randomize() n random().
Re: Функция random()
От: Дмитро  
Дата: 26.04.03 02:57
Оценка:
Здравствуйте, artgonch, Вы писали:

A>Извините за глупыфй вопрос. Не могу найти, в каком заголовке (VC++ 6.0) описаны функции randomize() n random().


#include <stdlib.h>

// Sets a random starting point.
void srand(unsigned int seed);

// Generates a pseudorandom number.
int rand(void);


--
Дмитрий
--
Дмитрий
Re[2]: Функция random()
От: Аноним  
Дата: 26.04.03 06:57
Оценка:
Здравствуйте, Дмитро, Вы писали:

Д>
Д>#include <stdlib.h>

Д>// Sets a random starting point.
Д>void srand(unsigned int seed);

Д>// Generates a pseudorandom number.
Д>int rand(void);

Д>


А как заставить её генерить числа больше чем 7fff? Переоределиение MAX_RAND не помогло.
Re[3]: Функция random()
От: MaximE Великобритания  
Дата: 26.04.03 08:03
Оценка:
Здравствуйте, <Аноним>, Вы писали:

Самый быстрый 32-битный генератор псевдослучайных чиесел (Д. Кнут):

    float rand0to1()
    {
        static int iran;
        iran = 1664525L * iran + 1013904223L;
        int temp = 0x3f800000 | (0x007fffff & iran);
        return reinterpret_cast<float&>(temp) - 1.F;
    }
Re[4]: Функция random()
От: WolfHound  
Дата: 26.04.03 14:54
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Самый быстрый 32-битный генератор псевдослучайных чиесел (Д. Кнут):


Уверен?
typedef unsigned int uint;
uint RandUint()
{
    static uint x1;
    static uint x2;
    x1+=x2+92735;//любые константы
    x2+=x1+14352;
    return x1;
}

... << RSDN@Home 1.0 beta 5 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[5]: Функция random()
От: MaximE Великобритания  
Дата: 26.04.03 18:31
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, MaximE, Вы писали:


ME>>Самый быстрый 32-битный генератор псевдослучайных чиесел (Д. Кнут):


WH>Уверен?

WH>
WH>typedef unsigned int uint;
WH>uint RandUint()
WH>{
WH>    static uint x1;
WH>    static uint x2;
WH>    x1+=x2+92735;//любые константы
WH>    x2+=x1+14352;
WH>    return x1;
WH>}
WH>

WH>

Что это — я не знаю .

Код, который привел я — реализация линейного конгруэнтного метода (Д.Кнут, том 2):

Xn+1 = (aXn + c) mod m, n >= 0

m - модуль, 0 < m
a - множитель, 0 <= a < m
c - приращение, 0 <= c < m
X0 - начальное значение 0x <= X0 < m


Чистла m, a и с должны быть тщательно подобраны для получения макимальных периода и потенциала. a == 1664525 и c == 1013904223 при m == 2 ^ 32 подобрал Кнут.
Re[4]: Функция random()
От: adontz Грузия http://adontz.wordpress.com/
Дата: 27.04.03 09:51
Оценка:
Здравствуйте, Дмитро, Вы писали:

Д>Я бы сделал так:

Д>
Д>long randtwice() {
Д>     return rand()*MAX_RAND+rand();
Д>}
Д>


Ты скоратил повторяемость в 2 раза, причём возможно не все биты в числе будут независимыми
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[5]: Функция random()
От: adontz Грузия http://adontz.wordpress.com/
Дата: 27.04.03 09:53
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Уверен?

WH>
WH>typedef unsigned int uint;
WH>uint RandUint()
WH>{
WH>    static uint x1;
WH>    static uint x2;
WH>    x1+=x2+92735;//любые константы
WH>    x2+=x1+14352;
WH>    return x1;
WH>}
WH>


Тау уж и любые? А если я сделаю 0 и 0?

Данные типы ГСЧ (основанные на вычитаниях) ещё плохо изучены, и не факт, что они дают равномерное распределение
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[6]: Функция random()
От: Аноним  
Дата: 28.04.03 08:20
Оценка:
Здравствуйте, Дмитро, Вы писали:

Д>
Д>long randtwice() {
Д>     return rand()*MAX_RAND+rand()
Д>}
Д>


A>Ты скоратил повторяемость в 2 раза,


Д>для того, чтобы сделать период нечетным, достаточно выбросить из рассмотрения какое-нибудь случайное число (просто пропускать его при генерации). При этом период уменьшится только на единицу.




return rand()*MAX_RAND+(rand() ^ rand())
Даст неплохой результат и по распределению и по независимости.

Удалено избыточное цитирование. -- ПК.
Re[4]: Функция random()
От: MaximE Великобритания  
Дата: 28.04.03 18:58
Оценка:
Я тут побаловался с таким генератором:

int random()
{
    static int iran = 0;
    iran = 1664525L * iran + 1013904223L;
    return iran;
}


Оказался достаточно качественен, хотя для крипто, конечно, не подойдет — его период равен == 0xffffffff.

А вообще, Д.Кнут приписал Джону фон Нейману следующие слова: "Каждый, кто применяет арифметические методы для создания случайных чисел, впадает в грех."
Re[5]: Функция random()
От: Dmitry Kukushkin  
Дата: 28.04.03 19:28
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Оказался достаточно качественен, хотя для крипто, конечно, не подойдет — его период равен == 0xffffffff.


Ну... Для крипто нужно что-нибудь потяжелее...
Типа:
unsigned long random()
{
    unsigned long data;
#ifdef _WIN32
    HCRYPTPROV hCryptProv;
    CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
    CryptGenRandom(hCryptProv, 4, ( unsigned char *)&data);
    if (hCryptProv)
    {
        CryptReleaseContext(hCryptProv, 0);
    }
#else
    int rand_fd = open("/dev/random", O_RDONLY);
    read(rand_fd, &data, 4);
    close(rand_fd);
#endif
    return data;
}
Re[6]: Функция random()
От: MaximE Великобритания  
Дата: 28.04.03 19:38
Оценка:
Здравствуйте, Dmitry Kukushkin, Вы писали:

DK>Ну... Для крипто нужно что-нибудь потяжелее...


[]

Есть ли основания доверять CryptGenRandom и "/dev/random"? Известна ли их реализация?
Re[7]: Функция random()
От: Dmitry Kukushkin  
Дата: 28.04.03 20:19
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Есть ли основания доверять CryptGenRandom и "/dev/random"? Известна ли их реализация?


Ну для /dev/random ( /dev/urandom ) известна ( исходники Linux,... )
В принципе там все четко. Рандомный пул замешивается MD5 при стартапе, через сколько то там чтений
еще MD5 и т.д.

Насчет CryptGenRandom — исходников, понятно, в свободном доступе нет, но там тоже, вроде, ничего себе.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.