Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php兰德vs Perl兰德_Php_Perl_Random - Fatal编程技术网

Php兰德vs Perl兰德

Php兰德vs Perl兰德,php,perl,random,Php,Perl,Random,我正在尝试将一段代码从perl移植到php。perl代码片段是akamai视频点播链接生成脚本的一部分。该脚本根据视频文件的位置/URL生成种子(对于单个URL,该位置/URL始终保持不变)。然后,它用于为流生成序列ID(基本上是一个使用种子的1到2000之间的随机数)。下面是perl代码。转换后的PHP代码是:PHPRAND的行为是否与perl不同?是。你不能指望他们的算法是一样的。对于perl,使用哪种rand取决于构建perl的平台 $seed=6718; srand($seed); pr

我正在尝试将一段代码从perl移植到php。perl代码片段是akamai视频点播链接生成脚本的一部分。该脚本根据视频文件的位置/URL生成种子(对于单个URL,该位置/URL始终保持不变)。然后,它用于为流生成序列ID(基本上是一个使用种子的1到2000之间的随机数)。下面是perl代码。转换后的PHP代码是:PHPRAND的行为是否与perl不同?

是。你不能指望他们的算法是一样的。对于perl,使用哪种rand取决于构建perl的平台

$seed=6718;
srand($seed);
print(int(rand(1999)) + 1); // return 442 every time
$seed=6718;
srand($seed);
echo(rand(0, 1999) + 1); //returns 155 every time
使用特定的算法可能会更幸运;例如,Mersenne Twister看起来可用于和。 更新:尝试它会产生不同的结果,所以至少有一个不会起作用


更新2:根据您显示的perl编号,您的perl正在使用drand48库;我不知道这是否适用于PHP,谷歌也帮不上忙。

仅仅看到这段代码,不可能判断它是否相同

首先,您需要知道,即使是像
rand()
函数这样的随机生成器也不是真正的随机生成器。它使用前一个数字的数学公式计算新值。使用
srand()
函数可以设置开始值

每次使用相同的参数调用
srand()
,意味着程序总是以相同的顺序返回相同的数字


如果您确实想要随机数,那么在Perl中应该删除
srand()
的初始化。因为当您第一次调用
rand()
函数时,Perl会自动将
srand()
设置为更好的(随机)值

如果您的程序真的需要随机数,那么PHP也可以。但即使在PHP中,我也会查看
srand()
是否自动设置并设置为更随机的值

如果您的程序不处理随机数,而是真正想要一个始终相同的数字流,那么代码片段可能不相同。即使使用srand()进行相同的初始化,也可能是PHP使用另一个公式来计算下一个“随机”数


所以如果你的代码真的想要随机数,你需要看看你周围的代码,如果是的,你可以使用这个代码。但即使这样,您也应该为srand()寻找更好的初始化方法。

[clippy]看起来您正在尝试对一个数字进行散列,也许您想使用散列函数?[/clippy]

散列函数的设计目的是获取一个输入并生成一个一致的可重复值,即外观随机的值。作为奖励,他们通常有跨语言的实现

使用
srand()
rand()
来获取基本上是散列值的内容是一个相当糟糕的主意。不同的语言使用不同的算法,有些只是使用系统库。更改(或升级)操作系统、标准C库或语言可能会导致截然不同的结果

使用SHA1获取介于1和2000之间的数字有点过分,但至少可以确保可以将代码移植到几乎任何语言,并且仍然可以获得相同的结果

use Digest::SHA1;

# get a integer hash value from $in between $min (inclusive) and $max (exclusive)
sub get_int_hash {
    my ($in, $min, $max) = @_;

    # calculate the SHA1 of $in, note $in is converted to a string.
    my $sha  = Digest::SHA1->new;
    $sha->add( "$in" );
    my $digest = $sha->hexdigest;
    # use the last 7 characters of the digest (28 bits) for an effective range of 0 - 268,435,455.
    my $value = hex substr $digest, -7;
    # scale and shift the value to the desired range.
    my $out = int( $value / 0x10000000 * ( $max - $min ) ) + $min;

    return $out;
}
print get_int_hash(6718, 1, 2000); #this should print 812 for any SHA1 implementation.

抱歉,我必须这样做:依赖于从
rand
返回的一组一致的数字,这意味着代码中存在更深层次的问题。我希望这只是一个好奇,而不是一些移植问题。如果是后者,则一次性转储perl和PHP中的“随机”数,执行所需的任何映射,然后删除对非随机数的依赖关系。@Mark:取决于代码正在执行的操作。例如,许多游戏都提供随机地图生成,还将告诉您任何特定地图使用的种子,以便您将来可以使用该种子重播同一地图(或将其发送给朋友等),而无需提供“保存地图”功能。对于依赖(伪)随机数的可重复序列来说,这是一个非常有效的用例。在不知道OP的代码的情况下,我们无法判断这样的依赖关系是否合适。@Dave-非常好。好吧,希望它适合您的用例,而不是我想象的那样。@Dave:是的,这是正确的。我已经相应地修改了这个问题。如果你真的想要随机数,你根本不会使用rand()。当然,rand()对于密码学来说还不够随机,但在很多情况下它就足够了。我想我已经回答了这个问题,如果它足够好的话。我不认为投反对票是正确的。即使您提到rand()不够随机。@从某种意义上讲,一个种子在提供更多随机性方面并不比另一个种子好。无论生成器的质量如何,这些都是伪随机数。所以,如果你真的想要随机数,你应该使用brian试图表达的观点,Perl会自动选择一个随机种子,而不是一个静态种子。因此,不要将srand()设置为“更好”的随机数。这并不意味着它们不是伪生成的。问题的关键是PHP代码和Perl代码是否相同。不是说伪随机数生成器有多好。我说过,这取决于应用程序如何处理这些数字。如果应用程序将该数字用作随机数,则代码相等。如果应用程序将这些数字用作始终返回相同数字的流,则代码不相等。
real
是他的应用程序处理数字的方式。如果
rand()。如果
rand()
返回真正的随机数,整个讨论只是时间的一部分,不是问题所在,也不是我所说的。我在第二句已经说过,
rand()
不会返回真正的随机数。