Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Другие языки > [Lua] Генерация случайных чисел


Автор: cleg 22.9.2006, 10:16
По идее должно быть нормально так:

Код

math.randseed = os.time()
print(math.random(10))


то есть проинициализировали генератор случайных чисел и пытаемся генерировать. но всегда получается 1. какое бы значение randseed я не присваивал. 
в чем тут собака порылась?

Автор: Cr@$h 22.9.2006, 14:58
Цитата

Функции random и randomseed представляют собой интерфейсы к простому генератору случайных чисел, предоставляемому ANSI C (соответвенно функции rand и srand). Не может быть дпно никаких гарантий касательно их статистических свойств. Функция random при вызове без параметров возвращает псевдослучайное вещественное число в диапазоне [0,1). При вызове с параметром n, random вернет псевдослучайное целое число в диапазоне [1,n]. При вызове с двумя параметрами l и u, random вернет псевдослучайное целое число в диапазоне [l,u]. Границы всегда входят в диапазон. 

Цитата

os.time ([table])

Returns the current time when called without arguments, or a time representing the date and time specified by the given table. This table must have fields year, month, and day, and may have fields hour, min, sec, and isdst (for a description of these fields, see the os.date function). 

The returned value is a number, whose meaning depends on your system. In POSIX, Windows, and some other systems, this number counts the number of seconds since some given start time (the "epoch"). In other systems, the meaning is not specified, and the number returned by time can be used only as an argument to date and difftime.

Кодом
Код

print(math.random(10))

Ты пытаешься генерить целое число из диапазона [1, 10]. А что если начальное значение
Код

math.randseed = os.time()

Интерпретируется для последовательности целых чисел одинаково (да и вообще, может). Посмотри, что возвращает os.time(). Например, гипотетически, если бы она возвращала число из интервала [0, 1], то, возможно, интерпретировалось бы как 0 для целых чисел, а значит последовательность начиналась бы с одного места. Это гипотетический пример. Попробуй в начале сам, в ручную задават seed и посмотри, работает ли. Если работает, выводи после установкии seed на экран os.time() и, если можно, сам math.randseed.

Автор: cleg 22.9.2006, 18:11
так я ж написал - какой бы randseed не ставил - не канает. результат один.
поиск по wiki Lua подсказал решение:

Код

math.randomseed( os.time() )
print(math.random(100))
print(math.random(100))


 smile 

оказывается randomseed - функция а не свойство. но странно почему тогда интерпретатор не ругается.
и второй интересный сюрприз - первое значение math.random() всегда одинаковое. а псевдослучайное значение получается только раза с третьего.

так что тему можно закрывать.

Автор: Cr@$h 22.9.2006, 18:37
Цитата(cleg @  22.9.2006,  19:11 Найти цитируемый пост)
оказывается randomseed - функция а не свойство. но странно почему тогда интерпретатор не ругается.

Ха, ничего себе. А, может, интерпретатор вообще не ловит такое.
Цитата(cleg @  22.9.2006,  19:11 Найти цитируемый пост)
и второй интересный сюрприз - первое значение math.random() всегда одинаковое. а псевдослучайное значение получается только раза с третьего

Дело в том, что если встретилось одинаковое число у двух последовательностей, то потом они совпадают, т.к. следующее число зависит от предыдущего. Странно всё это.

Автор: cleg 25.9.2006, 14:02
Да, в общем-то присваивание значения методу в рамках Lua - допустимая операция. Он трактует это как изменение ссылки.
А вот почему случайное число в псевдослучайной последовательности всегда второе - непонятно! :-)

ЗЫ Когда закончу разбираться с Lua выложу оформленые мысли. Язык интересный...

Автор: Cr@$h 25.9.2006, 17:41
Цитата(cleg @  25.9.2006,  15:02 Найти цитируемый пост)
А вот почему случайное число в псевдослучайной последовательности всегда второе - непонятно!

А первое всегда 1? Хм. smile Да, неочень хорошо, да и не встречал нигде. Он помнит seed внутри, но почему то использует его только на второй раз...
Цитата(cleg @  25.9.2006,  15:02 Найти цитируемый пост)
Когда закончу разбираться с Lua выложу оформленые мысли. Язык интересный... 

Давай, будет интересно многим, уверен. Если что у нас http://wiki.vingrad.ru/ есть, в Viki и раздел потом можно будет создать при необходимости.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)