challenge n人中m人が当選するくじ

n人の中から公平にm人を選ぶ、くじ引きプログラムを作ってください。

Posted feedbacks - awk

echo John Paul George Ringo | awk -v m=2 -f lot.awk のようにして使います。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
function swap(a, b,  tmp) { tmp = $a; $a = $b; $b = tmp }

{
  n = NF
  while (m) {
    swap(int(rand() * n + 1), n)
    print $n
    n--; m--;
  }
}

gawk -f lottery.awk <m> <n> [seed]
として使うと、0~(m-1)の数字からランダムでn個表示します。
seedはオプションです。

ex) gawk -f lottery.awk 10 3
0
4
7

任意の数字が選ばれる確率は、(残りの当選数)/(残りの総数)となります。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
BEGIN {
	m = ARGV[1]
	n = ARGV[2]
	if(ARGC == 4) {
		srand(ARGV[3])
	} else {
		srand()
	}

	for(i = 0; i < m; i++) {
		if(rand() * (m - i) < n) {
			print i
			n--
		}
		if(n == 0) {
			break
		}
	}
}

Index

Feed

Other

Link

Pathtraq

loading...