Ну да, про 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 <[email protected]> написал: > в 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 пользователь Вадим Власов > <[email protected]> написал: > > Привет всем, столкнулись со странным эффектом в 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 > > [email protected] | http://moscow.pm.org > > > -- > Moscow.pm mailing list > [email protected] | http://moscow.pm.org > -- С уважением, Вадим Власов т.: +7 (916) 424-00-72
-- Moscow.pm mailing list [email protected] | http://moscow.pm.org
