[Moscow.pm] странности округления и srand

Victor Efimov victor на vsespb.ru
Чт Окт 2 03:46:58 PDT 2014


Так это самое.. в доке как раз написано "Most implementations" "To be
safe, always pass srand an integer.".
Т.е. это поведение не документировано, гарантий нет. Поломали значит,
его, без сожаления, когда что-то исправляли. Например, могли
исправлять баг с генератором под win32, заодно общий код затронули.

2 октября 2014 г., 14:18 пользователь Вадим Власов
<scripter.vrn на gmail.com> написал:
> Ну да, про truncate понятно, не понятно, почему в 5.18 в нашем случае в
> большую сторону округляет.
> При этом, если явно подставить дробное число, тоже транкейтит, так же как и
> в 5.14:
>
> [scripter на dev-vbox:~]$ perl -v | fgrep version && perl -E 'srand(3.9); say
> rand'
> This is perl 5, version 14, subversion 2 (v5.14.2) built for
> x86_64-linux-gnu-thread-multi
> 0.783234962103055
>
> scripter на work-desktop:~$ perl -v | fgrep version && perl -E 'srand(3.9); say
> rand'
> This is perl 5, version 18, subversion 2 (v5.18.2) built for
> x86_64-linux-gnu-thread-multi
> 0.783234962103055
>
>
> И даже если вычислять аргумент, все равно идентичное поведение:
>
> [scripter на dev-vbox:~]$ perl -v | fgrep version && perl -E 'srand(7.8/2); say
> rand'
> This is perl 5, version 14, subversion 2 (v5.14.2) built for
> x86_64-linux-gnu-thread-multi
> 0.783234962103055
>
> scripter на work-desktop:~$ perl -v | fgrep version && perl -E 'srand(7.8/2);
> say rand'
> This is perl 5, version 18, subversion 2 (v5.18.2) built for
> x86_64-linux-gnu-thread-multi
> 0.783234962103055
>
>
> 2 октября 2014 г., 13:15 пользователь Victor Efimov <victor на vsespb.ru>
> написал:
>
>> в perldoc
>> ==
>> Most implementations of srand take an integer and will silently
>> truncate decimal numbers. This means srand(42) will usually produce
>> the same results as srand(42.1). To be safe, always pass srand an
>> integer.
>> ==
>>
>> p.s. мучался с предсказуемыми последовательностями псевдослучайных
>> чисел - советовали другой генератор
>> http://perlmonks.org/?node_id=1054438
>>
>>
>> 2 октября 2014 г., 13:05 пользователь Вадим Власов
>> <scripter.vrn на gmail.com> написал:
>> > Привет всем, столкнулись со странным эффектом в 5.18
>> >
>> > [scripter на dev-vbox:~]$ perl -v | fgrep ver
>> > This is perl 5, version 14, subversion 2 (v5.14.2) built for
>> > x86_64-linux-gnu-thread-multi
>> > [scripter на dev-vbox:~]$ perl -E '$dd = "20141002"; say 0.8 * $dd * $dd +
>> > 1.55
>> > * $dd + 59.3; say int( 0.8 * $dd * $dd + 1.55 * $dd + 59.3 );'
>> > 324528000469816
>> > 324528000469815
>> > [scripter на dev-vbox:~]$ perl -E '$dd = "20141002"; srand( 0.8 * $dd * $dd
>> > +
>> > 1.55 * $dd + 59.3 ); say rand()'
>> > 0.261590199385868
>> > [scripter на dev-vbox:~]$ perl -E '$dd = "20141002"; srand( int(0.8 * $dd *
>> > $dd
>> > + 1.55 * $dd + 59.3) ); say rand()'
>> > 0.261590199385868
>> >
>> > В 5.14 аргумент srand приводится к целому с отбраыванием дробной части,
>> > так
>> > же как с int.
>> >
>> >
>> > scripter на work-desktop:~$ perl -v | fgrep ver
>> > This is perl 5, version 18, subversion 2 (v5.18.2) built for
>> > x86_64-linux-gnu-thread-multi
>> > scripter на work-desktop:~$ perl -E '$dd = "20141002"; say 0.8 * $dd * $dd
>> > +
>> > 1.55 * $dd + 59.3; say int( 0.8 * $dd * $dd + 1.55 * $dd + 59.3 );'
>> > 324528000469816
>> > 324528000469815
>> > scripter на work-desktop:~$ perl -E '$dd = "20141002"; srand( 0.8 * $dd *
>> > $dd +
>> > 1.55 * $dd + 59.3 ); say rand()'
>> > 0.132392508051456
>> > scripter на work-desktop:~$ perl -E '$dd = "20141002"; srand( int(0.8 * $dd
>> > *
>> > $dd + 1.55 * $dd + 59.3) ); say rand()'
>> > 0.261590199385868
>> > scripter на work-desktop:~$ perl -E '$dd = "20141002"; srand( int(0.8 * $dd
>> > *
>> > $dd + 1.55 * $dd + 59.3)+1 ); say rand()'
>> > 0.132392508051456
>> >
>> > А в 5.18 округляется, так же как при выводе. Почему так? Такое поведение
>> > описано где-то?
>> >
>> > --
>> >   С уважением,
>> >   Вадим Власов
>> >   т.: +7 (916) 424-00-72
>> >
>> > --
>> > Moscow.pm mailing list
>> > moscow-pm на pm.org | http://moscow.pm.org
>> >
>> --
>> Moscow.pm mailing list
>> moscow-pm на pm.org | http://moscow.pm.org
>
>
>
>
> --
>   С уважением,
>   Вадим Власов
>   т.: +7 (916) 424-00-72
>
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>


Подробная информация о списке рассылки Moscow-pm