LoginSignup
3
2

More than 5 years have passed since last update.

D言語の乱数生成

Posted at

std.randomをインポートして使います. 乱数生成っていろいろあるんですね.

普通にランダムを使う

実行環境における "デフォルトの", "好ましい", "お勧めの" 乱数生成器です. (1) なにかしら良い乱数生成器が必要で,しかも (2) 細かい実装方式は特に気にしない,という場合はこの型を使うと良いでしょう.(公式サイトより)

import std.stdio, std.random;

void main()
{
 //upredictableSeedによって実行するごとに異なる乱数列を生成できる
 auto rnd = Random(unpredictableSeed);

 //0から99の整数値をうち一つを出力
 writeln(uniform(0, 100, rnd));

 //0から100の整数値をうち一つを出力
 writeln(uniform!"[]"(0, 100, rnd));

 //0から100のうち実数を一つ出力
 writeln(uniform(0.0L,100.0L,rnd));
}

配列をシャッフルする

import std.stdio, std.random;

void main()
{
 int[] i = [0,1,2,3,4,5,6,7,8,9];

 //upredictableSeedによって実行するごとに異なる乱数列を生成できる
 auto rnd = Random(unpredictableSeed);

 randomShuffle(i, rnd);
 writeln(i); //[9, 0, 8, 6, 4, 2, 5, 3, 1, 7] (一例)

 //二次元配列でも可能です
 int[][] j = [[0,1],[2,3],[4,5],[6,7],[8,9]];

 randomShuffle(j, rnd);
 writeln(j); //[[4, 5], [6, 7], [2, 3], [0, 1], [8, 9]] (一例)
}

非等確率で乱数を生成

dice(a,b,c)で0をa割,1,をb割,2をc割の確率で出るようにします(引数の個数は自由)

import std.stdio, std.random;

void main()
{
 foreach(int i; 0..10)
    writeln(dice(5,3,2));
}

配列の要素を一個ずつ出力

import std.stdio, std.random;

void main()
{
int[] a = [ 0, 1, 2, 3, 4, 5, 6, 7, 8 ];
auto rnd = Random(unpredictableSeed);
foreach (e; randomCover(a, rnd))
{
    writeln(e); //6 1 4 8 3 5 0 7の順で出力(一例)
}

writeln("");

//もう一回やるときは更新
rnd = Random(unpredictableSeed);

foreach (e; randomCover(a, rnd))
{
    writeln(e);
}

}

配列からn個の要素を取り出す

randomSampleを使います

import std.stdio, std.random;

void main()
{
int[] a = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ];

writeln(randomSample(a, 5)); //[1, 4, 5, 7 , 8] (一例)
}
3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2