忍者ブログ

神戸電子専門学校ゲームソフト学科の生徒が運営するGESのブログです。

   

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

乱数

夏休みも後一週間。
有意義に過ごしましょう。

今回は乱数について。
c言語で「rand」を呼び出しランダムな数値を取得していますよね。
そして戻り値は「int型」なのに数値は「0~32767」までと少ない数値が帰ってきています。
どういう計算が行われているのでしょうか。


拍手[0回]



------------------------------------------------------------------------------

Visual C++

static long x = 1;
int rand() { x = x * 214013 + 2531011; return ( int ) ( x >> 16 ) & 32767; }
void srand(long s) { x = s; }

------------------------------------------------------------------------------

コンパイラによって条件が変わってきます。
これは線形合法性という形です。
xの値は漸化式(再帰式)
X[n]=A*X[n-1]+C (mod 4294967296)
に基づいて計算される。
そして上位16ビットを右シフトしてその内の下位15ビットを返す。
さて、ここで乱数の数値範囲である「0~32767」の原因が見えてきましたね。
計算速度としてはまずまずの所なのだが、15bitでは精度が悪い。
また、種によって取得する数列は変わるのだがある大きな数値にまで行くと数列が同じになったりもする。

いろいろ問題を抱えた乱数生成関数。 その問題点を解決したものとして「メルセンヌツイスタ」や「XorShift」などがある。

もし興味があれば調べて、自分の知識をひろげましょう。
PR

COMMENT

NAME
TITLE
MAIL(非公開)
URL
EMOJI
Vodafone絵文字 i-mode絵文字 Ezweb絵文字
COMMENT
PASS(コメント編集に必須です)
SECRET
管理人のみ閲覧できます

ブログ内検索

最新コメント

[01/29 人面犬]
[10/01 8ch]
[09/12 uncle]
[09/10 某卒業生]
[06/07 uncle]

カレンダー

02 2024/03 04
S M T W T F S
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

テスト

Copyright ©  -- GESブログ --  All Rights Reserved
Design by CriCri / Photo by Geralt / powered by NINJA TOOLS / 忍者ブログ / [PR]