challenge 重複無し乱数

整数nを渡すと1 ~ n までの整数を重複しないようランダムに出力する関数「bingo」を作ってください。

このお題はraynstardさんの投稿を元にしています。ご投稿ありがとうございました。 投稿の内容には表示のしかたも含まれていたのですが、 このお題では「重複しない1~nまでの乱数をどうやって作るか」という点に集中することにして、 結果の整形は続編としてこの後のお題で出すことにします。 サンプル入出力は下のようになります。

>>> bingo(10)
[10, 7, 8, 4, 5, 2, 3, 1, 6, 9]
>>> bingo(3)
[2, 3, 1]
>>> bingo(3)
[2, 3, 1]
>>> bingo(3)
[3, 1, 2]
>>> bingo(10)
[7, 3, 8, 6, 4, 10, 9, 2, 1, 5]

Posted feedbacks - D

単純にシャッフルして作ります。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import std.random;

int[] bingo(int x)
{
        int[] xs;
        for (int i = 1; i <= x; ++i) {
                xs ~= i;
        }
        for (int i = 0; i < x; ++i) {
                uint r = rand() % x;
                int tmp = xs[r];
                xs[r] = xs[i];
                xs[i] = tmp;
        }
        return xs;
}

/*
import std.stdio;
import std.string;

void main(char[][] args)
{
        for (int i = 1; i <= 10; ++i) {
                int[] xs = bingo(i);
                string s = "[";
                foreach (j; xs) {
                        s ~= toString(j) ~ ",";
                }
                s = s[0 .. $ - 1] ~ "]";
                writef("%s\n", s);
        }
}
*/

D 2.008 で std.random に追加された機能を使っていますが、dmd 2.009 ではコンパイルできませんでした。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import std.stdio;
import std.random;

void bingo(uint n){
    uint[] a;
    a.length = n;
    foreach(i, ref e; a){
        e = i + 1;
    }
    randomShuffle(a, Random(unpredictableSeed()));
    writefln(a);
}

void main(){
    bingo(10);
}

Index

Feed

Other

Link

Pathtraq

loading...