![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
Chingachguk |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: нет Всего: 18 |
Вопрос такой: нужна реализация ф-ции rand() на Перл и(или) на php. По моим данным, она находится в файле rand.t. Реализация представляет собой коэффициенты конгруэнтного генератора:
Ii+1=(a*Ii+c) mod m, a,c и m (m скорее всего 2^32) или что-то другое (маловероятно). Если у Вас нету, то просьба хотя бы сгенерить несколько результатов работы с различными инициализаторами srand(): 1. srand(0); rand(); - ? 2. srand(1); rand(); - ? 3. srand(0x80000000); rand(); - ? 4. srand(_что-то_еще_); rand(); - ? ... Версия и платформа любая, если можно тока указать ту, на которой Вы получили результаты. Спасибо. -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
konst |
|
|||
Unregistered |
@rand = qw( 0 1 0x80000000 something 99 901 -20 );
foreach $r (@rand) { srand("$r"); print "$r = ",rand(),"\n"; } ====REZULTS === 0 = 0.17082803610629 1 = 0.0416303447718782 0x80000000 = 0.17082803610629 something = 0.17082803610629 99 = 0.380256593999551 901 = 0.763708143801527 -20 = 0.75478186279452 =========== |
|||
|
||||
konst |
|
|||
Unregistered |
Забыл про платформу
RH 7.3 |
|||
|
||||
Chingachguk |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: нет Всего: 18 |
Большое спасибо !
Тогда еще такая просьба: насколько я понял, в Перл rand() (без параметров ?) по умолчанию возвертает случайное число в интервале [0,1] (те вещественное). Не могли бы Вы повторить выполнение с указанным диапазоном, например - 100: srand(0); rand(100)... - ? -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
konst |
|
|||
Unregistered |
@rand = qw(0 1 0x80000000 something 99 901 -20);
foreach $r (@rand) { srand("$r"); print "SRAND=$r\n"; for $param (0,10,100,-20) { print " PARAM=$param ::: ",rand($param),"\n"; } } === rezults === SRAND=0 PARAM=0 ::: 0.17082803610629 PARAM=10 ::: 7.49901980484964 PARAM=100 ::: 9.63716556235674 PARAM=-20 ::: -17.4093045405415 SRAND=1 PARAM=0 ::: 0.0416303447718782 PARAM=10 ::: 4.54492444728629 PARAM=100 ::: 83.4817218166915 PARAM=-20 ::: -6.719720602904 SRAND=0x80000000 PARAM=0 ::: 0.17082803610629 PARAM=10 ::: 7.49901980484964 PARAM=100 ::: 9.63716556235674 PARAM=-20 ::: -17.4093045405415 SRAND=something PARAM=0 ::: 0.17082803610629 PARAM=10 ::: 7.49901980484964 PARAM=100 ::: 9.63716556235674 PARAM=-20 ::: -17.4093045405415 SRAND=99 PARAM=0 ::: 0.380256593999551 PARAM=10 ::: 5.04357940607832 PARAM=100 ::: 20.2482347414968 PARAM=-20 ::: -19.1404947144282 SRAND=901 PARAM=0 ::: 0.763708143801527 PARAM=10 ::: 5.85910264027433 PARAM=100 ::: 43.5823507179645 PARAM=-20 ::: -6.09417672914688 SRAND=-20 PARAM=0 ::: 0.75478186279452 PARAM=10 ::: 6.58092695611657 PARAM=100 ::: 32.7460404756618 PARAM=-20 ::: -11.2009832932917 ============ 1. srand вообще-то инициализтруется при запуске rand 2. для целых из диапазона (0 .. $max) === int (rand($max)); 3. Если есть *nix платформа perldoc -f rand perldoc -f srand Если нет: rand EXPR rand Returns a random fractional number greater than or equal to "0" and less than the value of EXPR. (EXPR should be positive.) If EXPR is omitted, the value "1" is used. Automatically calls "srand" unless "srand" has already been called. See also "srand". (Note: If your rand function consistently returns numbers that are too large or too small, then your version of Perl was probably compiled with the wrong number of RANDBITS.) ============= srand EXPR srand Sets the random number seed for the "rand" opera- tor. If EXPR is omitted, uses a semi-random value supplied by the kernel (if it supports the /dev/urandom device) or based on the current time and process ID, among other things. In versions of Perl prior to 5.004 the default seed was just the current "time". This isn't a particularly good seed, so many old programs supply their own seed value (often "time ^ $$" or "time ^ ($$ + ($$ << 15))"), but that isn't necessary any more. In fact, it's usually not necessary to call "srand" at all, because if it is not called explicitly, it is called implicitly at the first use of the "rand" operator. However, this was not the case in version of Perl before 5.004, so if your script will run under older Perl versions, it should call "srand". Note that you need something much more random than the default seed for cryptographic purposes. Checksumming the compressed output of one or more rapidly changing operating system status programs is the usual method. For example: srand (time ^ $$ ^ unpack "%L*", `ps axww | gzip`); If you're particularly concerned with this, see the "Math::TrulyRandom" module in CPAN. !!! Do not call "srand" multiple times in your program unless you know exactly what you're doing and why you're doing it. The point of the function is to "seed" the "rand" function so that "rand" can pro- duce a different sequence each time you run your program. Just do it once at the top of your pro- gram, or you won't get random numbers out of "rand"! Frequently called programs (like CGI scripts) that simply use time ^ $$ for a seed can fall prey to the mathematical prop- erty that a^b == (a+1)^(b+1) one-third of the time. So don't do that. =========== |
|||
|
||||
Chingachguk |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: нет Всего: 18 |
О ! Спасибо !
Тогда, если Вам нетрудно, еще один эксперимент: те же самые инициализации srand(0,1,2,0x80000000...), но чему равно это int(rand(max_num)) для max_num...например, 100 или 50. Т.е. мне нужны примеры на целых числах, хотя я подозреваю, что rand() без параметров - это значение генератора, деленное на максимально возможное его значение (так можно получить 0...1) -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
konst |
|
|||
Unregistered |
@rand = qw(0 1 0x80000000 99 901 -20);
foreach $r (@rand) { srand("$r"); print "----------\nSRAND=$r\n"; for $param (10,50,100) { print " PARAM=$param ::: ",int (rand($param)),"\n"; } } ========rez==== SRAND=0 PARAM=10 ::: 1 PARAM=50 ::: 37 PARAM=100 ::: 9 ---------- SRAND=1 PARAM=10 ::: 0 PARAM=50 ::: 22 PARAM=100 ::: 83 ---------- SRAND=0x80000000 PARAM=10 ::: 1 PARAM=50 ::: 37 PARAM=100 ::: 9 ---------- SRAND=99 PARAM=10 ::: 3 PARAM=50 ::: 25 PARAM=100 ::: 20 ---------- SRAND=901 PARAM=10 ::: 7 PARAM=50 ::: 29 PARAM=100 ::: 43 ---------- SRAND=-20 PARAM=10 ::: 7 PARAM=50 ::: 32 PARAM=100 ::: 32 ============ Что за проблемы с srand? Если им непользоваться, то все работает прекрасно: for (1 .. 5) { for (1 .. 10) { print int(rand(33))," "; } print "\n"; } ====rez=== 3 17 22 21 10 18 16 7 18 30 19 11 8 23 31 17 24 23 21 6 24 0 14 32 4 31 16 17 15 12 11 14 30 24 26 20 16 21 9 27 10 6 13 25 9 24 20 1 22 28 еще: 14 10 25 2 8 13 28 32 32 26 25 30 31 3 27 0 23 5 9 12 20 32 9 15 26 8 27 32 13 10 9 13 19 29 26 11 26 3 6 11 31 21 23 1 26 8 4 25 5 2 и еще: 9 18 26 5 27 25 14 3 26 11 0 20 15 9 8 15 21 28 24 13 24 20 18 5 17 26 12 6 4 4 7 26 31 15 15 16 29 29 11 18 2 2 17 15 21 1 13 27 10 24 ======= В чем все-таки проблема? Как работает srand & rand описано в perldoc -f .. |
|||
|
||||
Chingachguk |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: нет Всего: 18 |
> В чем все-таки проблема?
> Как работает srand & rand описано в perldoc -f .. Проблем с этими функциями у меня нет - я даже перла в глаза никогда не видел. Все, что я хотел узнать - это как реализована rand(). Судя по тому, что ты мне дал, моя гипотеза насчет конгруэнтного генератора оказалась верной и я надеюсь вычислить те самые коэффициенты ... -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |