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()よりは使えそうかな。