在perl中生成随机二进制数

在perl中生成随机二进制数,perl,random,Perl,Random,我想通过使用perl生成只包含0和1(例如111111101111000000)的非重复6位的64次迭代。 我找到了可以生成随机十六进制的代码,并尝试对其进行修改,但我认为我的代码完全错了。这是我的代码: use strict; use warnings; my %a; foreach (1 .. 64) { my $r; do { $r = int(rand(2)); } until (!exists($a{$r})); printf "%06d\n

我想通过使用perl生成只包含0和1(例如111111101111000000)的非重复6位的64次迭代。 我找到了可以生成随机十六进制的代码,并尝试对其进行修改,但我认为我的代码完全错了。这是我的代码:

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}++;
}

如果需要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位二进制数。

如果需要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位二进制数。

您的意思是想要64个彼此不同的6位数字吗?如果是这样的话,那么您应该将列表洗牌
(0,1,2,3,…,63)
,因为总共有64个六位数字,您只需要按随机顺序排列即可

如果要将它们打印为基二字符串,请使用
%06b
格式

use List::Util;

my @list = List::Util::shuffle 0..63;
printf "%06b\n", $_ for @list;

你的意思是你想要64个六位的数字,所有的数字都是彼此不同的吗?如果是这样的话,那么您应该将列表洗牌
(0,1,2,3,…,63)
,因为总共有64个六位数字,您只需要按随机顺序排列即可

如果要将它们打印为基二字符串,请使用
%06b
格式

use List::Util;

my @list = List::Util::shuffle 0..63;
printf "%06b\n", $_ for @list;
从评论中:


我实际上想生成所有可能的6位二进制数。由于手工编写所有可能的组合都很麻烦,而且容易出现人为错误,因此我认为最好只使用rand()不重复地生成它并将其存储到数组中

这是一种非常低效的方法,多亏了随机数的综合

您可以通过以下方式获得相同的结果:

printf ( "%06b\n", $_ ) for 1..63;
如果你想要一个随机的订单(尽管,你似乎并不建议你这样做):

从评论中:


我实际上想生成所有可能的6位二进制数。由于手工编写所有可能的组合都很麻烦,而且容易出现人为错误,因此我认为最好只使用rand()不重复地生成它并将其存储到数组中

这是一种非常低效的方法,多亏了随机数的综合

您可以通过以下方式获得相同的结果:

printf ( "%06b\n", $_ ) for 1..63;
如果你想要一个随机的订单(尽管,你似乎并不建议你这样做):


谢谢你的代码会生成重复的随机数吗?我已经编辑了代码以避免重复,一开始我没有注意到这个要求。如果这是目标的话,我认为另一个答案实际上更好,但我将把这个答案留在这里,以展示如何更改现有代码以使其工作。非常感谢。还有一件事。你能解释一下printf“%06b\n”
吗。我不确定
%b
是否用于。它用于将数字格式化为二进制。%d代表十进制,%b代表二进制谢谢!。你的代码会生成重复的随机数吗?我已经编辑了代码以避免重复,一开始我没有注意到这个要求。如果这是目标的话,我认为另一个答案实际上更好,但我将把这个答案留在这里,以展示如何更改现有代码以使其工作。非常感谢。还有一件事。你能解释一下printf“%06b\n”
吗。我不确定
%b
是否用于。它用于将数字格式化为二进制。%d代表十进制,%b代表二进制,你用随机数做什么?因为您应该注意到-perl random不是“强”的,所以不适合任何与安全相关的东西。实际上,我想生成所有可能的6位二进制数。由于手工编写所有可能的组合都很麻烦,而且容易出现人为错误,因此我认为最好只使用rand()不重复地生成组合并将其存储到数组中。这是一种非常低效的方法。为什么不从0数到63,然后用二进制打印呢?我忘了我实际上可以用
printf
以二进制格式打印。谢谢你用随机数做什么?因为您应该注意到-perl random不是“强”的,所以不适合任何与安全相关的东西。实际上,我想生成所有可能的6位二进制数。由于手工编写所有可能的组合都很麻烦,而且容易出现人为错误,因此我认为最好只使用rand()不重复地生成组合并将其存储到数组中。这是一种非常低效的方法。为什么不从0数到63,然后用二进制打印呢?我忘了我实际上可以用
printf
以二进制格式打印。谢谢