пятница, 26 марта 2010 г.

rand в newLISP + Windows (RAND_MAX)

Где-то в недрах исходников newLISP есть константа RAND_MAX. Для Windows она равна 32767, для Tru64Unix , соответственно, 2147483647. Это, что как, (- (pow 2 31) 1).

Из-за этого в Windows функция rand физически не может сгенерить больше чем 32768 разных случайных чисел. Проверить это довольно просто:

> (length (unique (rand 1000000 1000000)))
32767


Что делать, если нам таки нужно больше случайных чисел?

Лично я сделал функцию (rand_64):

(define (rand_64 top num)
(map (fn (x y) (/ (* (+ (* x 32768) y) top) 1073741824))
(rand 32768 num) (rand 32768 num)))


Если я правильно всё рассчитал (в чём я ни разу не уверен) она умеет генерить уже не 32 тысячи, а примерно миллиард разных случайных чисел.

Комментариев нет:

Отправить комментарий

Архив блога