我想通过使用perl生成64次迭代的非重复6位数字,其仅由0和1组成(例如,111111,101111,000000)。 我发现代码可以生成随机十六进制并尝试修改它,但我认为我的代码都是错误的。这是我的代码:
use strict;
use warnings;
my %a;
foreach (1 .. 64) {
my $r;
do {
$r = int(rand(2));
}
until (!exists($a{$r}));
printf "%06d\n", $r;
$a{$r}++;
}
答案 0 :(得分:4)
你的意思是你想要64个六位数字,它们彼此不同吗?如果是这样,那么你应该只是改变列表(0, 1, 2, 3, …, 63)
,因为正好有64个六位数 - 你只需要它们是随机顺序。
如果您想将它们打印为基本字符串,请使用%06b
格式。
use List::Util;
my @list = List::Util::shuffle 0..63;
printf "%06b\n", $_ for @list;
答案 1 :(得分:3)
来自评论:
我实际上想要生成所有可能的6位二进制数。由于手工编写所有可能的组合很麻烦并且容易出现人为错误,我认为通过使用没有重复的rand()生成它并将其存储到数组中是个好主意。
由于随机数量的冲突,这是一种非常无情的方法。
你得到的结果与:
相同printf ( "%06b\n", $_ ) for 1..63;
如果您正在接受随机订单(但是,您似乎并不建议您这样做):
use List::Util qw ( shuffle );
printf ( "%06b\n", $_ ) for shuffle (0..63);
答案 2 :(得分:1)
如果你想要64 x 6位整数,你可以调用int(rand(64));
64次,不需要单独生成每个位。
您的代码可以修改为这样:
#!/usr/bin/perl
# your code goes here
use strict;
use warnings;
my %a;
foreach (1 .. 64) {
my $r;
do
{
$r = int(rand(64));
} until (!exists($a{$r}));
printf "%06b\n", $r;
$a{$r}++;
}
结果存储在整数数组中。 %06b
格式说明符字符串打印出一个6位二进制数。