我想生成随机十六进制值,这些值不应该是重复的,它应该是4个字节(即:0x00000000到0xffffffff),显示输出应该包含前导零.
例如:如果我得到值1,则不应表示为0x1而是0x00000001.
我想要至少100个随机值.请告诉我:我怎么能在Perl中做到这一点?
要获得0 ..(2 << 32)-1范围内的随机数:
my $rand = int(rand(0x100000000));
Run Code Online (Sandbox Code Playgroud)
要用带有前导零的十六进制打印它:
printf "%08x", $rand;
Run Code Online (Sandbox Code Playgroud)
请在Perl手册页中注意这一点:
注意:如果您的rand函数始终返回太大或太小的数字,那么您的Perl版本可能使用错误的RANDBITS编译
如果这是一个问题,请改为:
printf "%04x%04x", int(rand(0x10000)), int(rand(0x10000));
Run Code Online (Sandbox Code Playgroud)
另请注意,这对防止重复没有任何作用,但老实说,在100数字序列中重复32位数的可能性非常小.
如果您不重复这一点绝对必要,请执行以下操作:
my (%a); # create a hash table for remembering values
foreach (0 .. 99) {
my $r;
do {
$r = int(rand(0x100000000));
} until (!exists($a{$r})); # loop until the value is not found
printf "%08x\n", $r; # print the value
$a{$r}++; # remember that we saw it!
}
Run Code Online (Sandbox Code Playgroud)
对于它的价值,如果可能值的范围小于(或甚至接近)所需值的数量,则不应使用该算法.这是因为随机数生成器循环将重复拉出已经看到的数字.
然而,在这种情况下,可能的范围是如此之高(2 ^ 32)并且值的数量如此之低,它将完美地工作.确实,这个范围很高,这是唯一实用的算法.