LoginSignup
3
4

More than 5 years have passed since last update.

コピペで使える乱数メソッド

Last updated at Posted at 2017-11-29

rand()で作った値が偏ってて使えないので、色々ググって実装。
アルゴリズムはXorshiftを使用。

C
unsigned long sd[4] = { 123456789, 362436069, 521288629, 88675123 };

void seed(unsigned long s) {
    for (int i = 1 ; i <= 4; i++) {
        sd[i - 1] = s = 1812433253U * (s ^ (s >> 30)) + i;
    }
}

unsigned long xrand(unsigned int min, unsigned int max) {
    unsigned long t;
    t = (sd[0] ^ (sd[0] << 11));
    sd[0] = sd[1];
    sd[1] = sd[2];
    sd[2] = sd[3];
    return floor(min + (sd[3] = (sd[3] ^ (sd[3] >> 19) ) ^ (t ^ (t >> 8))) % ((max + 1) - min));
}

呼び出し元

Objective-C
// シード値を設定
seed((unsigned long)[[NSDate date] timeIntervalSince1970]);

// 1 ~ 100の乱数を作成
for (int i = 0; i < 100; ++i) {
    NSLog(@"%ld", xrand(1, 100));
}

ログ

Output
18
31
49
25
90
75
41
83
2
52
88
63
76
4
.
.
.

ひとまず、rand()よりは使えそうかな。

参考
https://ja.wikipedia.org/wiki/Xorshift

3
4
1

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
4