HELP
- From
- Max Alekseyev (2:5015/60)
- To
- Ianos Gnatiuc
- Date
- 2002-10-09T18:49:46Z
- Area
- RU.ALGORITHMS
████ OS/2 Hi, Ianos !
Replying to a message of Ianos Gnatiuc to Max Alekseyev:
IG>>> inline DWORD irand()
IG>>> {
IG>>> iholdrand *= 214013;
IG>>> iholdrand += 2531011;
IG>>> return iholdrand;
IG>>> }
MA>> Где такой irand() используется? В каком-то рантайме или самопальный?
IG> частично свой, константы брал из стандартной библиотечке C, в которой
IG> rand возвращает число из [0..7FFF] (m == 0x8000)
Точнее она взята из рантайма MSVC++. Я константы в десятичной записи не признал ;-)
А стандарт ANSI на RNG в C выглядит так:
unsigned int rand()
{
seed = seed * 0x41C64E6Du + 0x3039;
return (seed>>0x10)&0x7FFF;
}
IG> нужно было случайное 32 битное число, и остался озадаченным, когда
IG> понял, что те же константы подойдут и для чисел больше чем 7FFF.
IG> хотя такая функция не совсем корректно работает, так как одно и тоже
IG> число не может появиться 2 раза подряд,
Может. После 2^32 итераций.
IG> поэтому хочется эту функцию на _int64 переселить. :)
Выбирай любые константы, удовлетворяющие указанной теореме для m=2^64.
Можно использовать те же самые кстати, только разрядность увеличить до 64-х.
MA>> В Кнута есть такая теорема:
MA>> Длина периода линейной конгруэнтной последовательности (т.е.
MA>> последовательности, вида X = (a*X+c) % m) равна m тогда и только
MA>> тогда, когда:
MA>> 1. НОД(c,m) = 1 (т.е. c и m взаимно просты)
MA>> 2. b=a-1 кратно p для всех простых p - делителей m
MA>> 3. b кратно 4, если m кратно 4
Regards, °°
Max ~
--- FleetStreet 1.27.3.8
* Origin: (2:5015/60)