アプリ版:「スタンプのみでお礼する」機能のリリースについて

Xorshiftで乱数を作る所までは実装できたのですが、
rand()%10000; のように
欲しい範囲を絞り込む“適切”な方法が解らず困っております。

Xorshiftではどうやれば良いものなのでしょうか・・?

A 回答 (2件)

仮にrand()に偏りがでないとしても


rand()%10000;という使い方では偏りがでることを知っておいてください。
RAND_MAXが32767の場合、
結果が2000になるにはrand()が2000 12000 22000 32000の4パターン
ありますが
3000の場合は3000 13000 23000の3パターン
となり偏りが出ます。

ただXorshiftであれば乱数の最大値が大きいため
ゲーム等であれば
xor128() % 10000で十分な精度だと思います。
※xor128()はXorshiftの関数
    • good
    • 0
この回答へのお礼

今まで使っていたrand()とはそういう存在で
%で余りを求めるのはそういう意味だったのですね。
利用方法でどの程度の偏りが出るかうっすら解った気がします。
ご回答、ありがとうございました。

お礼日時:2010/11/25 16:37

#1 にも書かれていますが, 最終的に得たい値の範囲が疑似乱数で得られる値の範囲に対して十分小さければ余りを求めるような方法で「だいたい一様」にすることができます.


本気で一様にしようとすると, Xorshift の周期が 2^128-1 であることが問題になります. Xorshift で得られるのは 32ビット整数値で, これと周期とを比較すればわかるように「32ビットのすべての整数値が同じ頻度で現れるわけではない」ということになります. つまり, Xorshift で得られる値がすでに「完全に一様ランダム」ではありません. そこの補正から始める必要があります.
    • good
    • 1
この回答へのお礼

難しく理解しきれない部分が有りますが、
「だいたい一様」と「完全に一様ランダム」という差が絶対に出るのですね。
今回は「だいたい一様」で良いのでどうやら%するだけで大丈夫ですが、
「完全に一様ランダム」ではないと肝に銘じておきます。

ご回答ありがとうございました。

お礼日時:2010/11/25 16:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!