2015-05-18 38 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);