Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Реализация rand() на Перл(и/или php), ...или хотя бы пример выполнения 
:(
    Опции темы
Chingachguk
Дата 24.12.2002, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 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.
PM MAIL ICQ   Вверх
konst
Дата 25.12.2002, 02:45 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


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
Дата 25.12.2002, 02:55 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Забыл про платформу
RH 7.3
  Вверх
Chingachguk
Дата 25.12.2002, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 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.
PM MAIL ICQ   Вверх
konst
Дата 25.12.2002, 19:49 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


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
Дата 25.12.2002, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 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.
PM MAIL ICQ   Вверх
konst
Дата 25.12.2002, 21:30 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


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
Дата 25.12.2002, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



> В чем все-таки проблема?
> Как работает srand & rand описано в perldoc -f ..

Проблем с этими функциями у меня нет - я даже перла в глаза никогда не видел. Все, что я хотел узнать - это как реализована rand(). Судя по тому, что ты мне дал, моя гипотеза насчет конгруэнтного генератора оказалась верной и я надеюсь вычислить те самые коэффициенты ...


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0752 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.