2011年8月23日 星期二

樂透號碼產生器

所謂樂透號碼,就是從某範圍整數中,隨機且不重複的選取其中幾個。例如台灣的今彩就是從1到39當中選5個。要從電腦隨機產生一組號碼,比較基本的有以下兩種

1.每個號碼隨機選號,選重複的再去掉。但是這方法很笨,而且選號一多就會慢到不行。

2.模仿開彩方式,按照正確機率依序選擇號碼。以今彩為例,抽中39號的機率是5/39,下一步驟抽中38號的機率就變成5/38(上步驟未抽中39號)或4/38(上步驟抽中39號),依此類推。

第二個方式顯然快多了。下面awk程式(lottery.awk)實現此作法

在類似unix系統環境下,實行

echo "1 39 5" | awk -f lottery.awk

或是perl:
#!/usr/bin/perl
$min=$ARGV[0];
$max=$ARGV[1];
$needed=$ARGV[2];
$available=$max-$min+1;
while (@selected < $ARGV[2]) {
if(rand() < $needed/$available) {
push(@selected, $available);
$needed -= 1;
}
$available -= 1;
}
foreach $number (@selected) {
print($number . "\n");
}


執行
$./lottery.pl 1 39 5

會印出1~39隨機取5個的數字

沒有留言: