生成perl

时间:2015-05-18 06:11:17

标签: perl random

我想通过使用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}++;
}

3 个答案:

答案 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位二进制数。