Php rand vs Perl rand

时间:2011-07-08 06:39:11

标签: php perl random

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

$seed=6718;
srand($seed);
print(int(rand(1999)) + 1); // return 442 every time
转换后的PHP代码是:
$seed=6718;
srand($seed);
echo(rand(0, 1999) + 1); //returns 155 every time
php rand的行为是否与perl不同?

3 个答案:

答案 0 :(得分:8)

是。你不能依赖他们的算法是相同的。对于perl,使用rand取决于你为perl构建的平台。

使用特定算法可能会有更多运气;例如,Mersenne Twister看起来可用于PHPPerl。 更新:尝试它会产生不同的结果,这样一个人至少不会做这个伎俩。

更新2:从你显示的perl号码,你的perl正在使用drand48库;我根本不知道PHP是否可以使用,谷歌也没有帮助。

答案 1 :(得分:2)

[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.

答案 2 :(得分:0)

只要看到这段代码就不可能说它是否相同。

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

每次使用相同的参数调用srand()意味着程序始终以相同的顺序返回相同的数字。

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

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

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

如果您的代码确实需要随机数,那么您需要查看周围的代码,如果是,您可以使用此代码。但即使这样,你也应该为srand()寻找更好的初始化。