2015-05-18 27 views
1

我想通过使用perl生成64个不重复的只包含0和1(例如111111,101111,000000)的6位数字的迭代。 我发现的代码可以生成随机十六进制并尝试修改它,但我认为我的代码都是错误的。这是我的代码:在perl中生成随机二进制数

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

你是什么使用你的随机数字?因为你应该注意 - perl随机不是'强',所以不适合任何与安全有关的东西。 – Sobrique

+0

我实际上想要生成所有可能的6位二进制数。由于手写所有可能的组合很麻烦,并且容易出现人为错误,所以我认为通过使用rand()而不重复并将其存储到数组中来生成它是个好主意。 – irwan

+3

这是一个非常低效的方法。为什么不计算从0到63并以二进制打印? – Sobrique

回答

1

如果你想64×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位二进制数。

+0

谢谢!你的代码会产生重​​复的随机数吗? – irwan

+1

我编辑了代码以避免重复,起初我没有注意到这一要求。我认为其他答案实际上更好,如果这是目标,但我会在这里留下这个答案,以显示如何改变现有代码以使其工作。 – samgak

+0

非常感谢。还有一件事。你能解释一下'printf'%06b \ n“'。我不确定'%b'是用于。 – irwan

4

你的意思是你想要64位的六位数字,所有的数字都不同?如果是这样,那么你应该洗牌清单(0, 1, 2, 3, …, 63),因为正好有64个六位数字 - 你只是想要他们在随机顺序。

如果要将它们打印为base-two字符串,请使用%06b格式。

use List::Util; 

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

@Sobrique建议采取,谢谢! –

3

从评论:

我其实想生成所有可能的6位二进制数。由于手写所有可能的组合很麻烦,并且容易出现人为错误,所以我认为通过使用rand()而不重复并将其存储到数组中来生成它是个好主意。

这是一个非常不可靠的方法,由于随机数collisons。

你得到相同的结果:

printf ("%06b\n", $_) for 1..63; 

如果你随机顺序之后是(虽然,你似乎不建议你这么做):

use List::Util qw (shuffle); 
printf ("%06b\n", $_) for shuffle (0..63);