1read 100read
2012年6月プログラム533: 疑似乱数2 (410) TOP カテ一覧 スレ一覧 2ch元 削除依頼
懐かしきベーマガの面白かった投稿プログラムを語る (740)
俺主催囲碁プログラミングコンテスト (570)
C++でXML(主にxerces)やろう! (673)
【C++】高速化手法【SSE】 (806)
Google Maps API 質問箱 (317)
【上流社会】MSDNサブスクリプション総合【最先端】 (617)

疑似乱数2


1 :07/10/17 〜 最終レス :12/01/02
擬似乱数発生器について語ろうか。その2
前スレ
擬似乱数
http://pc11.2ch.net/test/read.cgi/tech/1146071975/
関連スレ
【危険】とんでもプログラムスレッド【悪質】
http://pc11.2ch.net/test/read.cgi/tech/1191860116/
SIMD-oriented Fast Mersenne Twister (SFMT):
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/SFMT/index.html

2 :
で、いつになったらSFMTはboostに組み込まれるの?

3 :
俺用メモ
18* 名前:デフォルトの名無しさん [] 投稿日:2006/04/28(金) 23:53:29
軽さで言えばXorShiftとか。
unsigned long xor128(){
static unsigned long x=123456789,y=362436069,z=521288629,w=88675123;
unsigned long t;
t=(x^(x<<11));x=y;y=z;z=w; return( w=(w^(w>>19))^(t^(t>>8)) );
}

4 :
>>3
せっかくだからURLも貼っとこう
http://web.comlab.ox.ac.uk/oucl/work/richard.brent/pub/pub218.html

5 :
この手の乱数マジックナンバーでよくでてくる
123456789
なにふざけてるのかと思ってたら、
0.1234567891011121314… って超越数なんだな。
つまり123456789は、その超越数を10億倍して9桁の精度で切り落とした、
そこそこ質のよい数なのであった。
目からウロコ

6 :
マジックナンバーに0xDEADBEEFってよく見る

7 :
SFMTはCPUの機能に最適化させてるメルセンヌツイスタですよね?
boostはテンプレートライブラリだからそれはいつまでたっても組み込まれないと自分は思います…。

8 :
>>7意味不明

9 :
C++のテンプレートライブラリとして実装するものなのかなと思っただけです。

10 :
独自の乱数発生器を組み込めるのがboost::randomのよいところ。
手直しは必要だが。
っていうか、boostがテンプレートライブラリだなんて誰が言ってるの?
STLの事じゃなくて?

11 :
実際違いました…すみません。
boostの一部がSTLに移植されるとか書いてあったの見てたから勘違いかな…。
regexとかはテンプレートライブラリではなかったです。
あと、SFMTの情報斜め読みしてたから勘違いしてしまいました。申し訳ありません。

12 :
RandomはTR1に入った、つまり標準ライブラリ入り内定ではある。
Regexは、テンプレートライブラリと呼ぶかどうかはともかく、
basic_regexなどテンプレートはよく使っている。

13 :
regexがプリコンパイル方式なのは型が最初から決まってるからじゃん。

14 :
Xorshift RNGs
unsigned long xor128(){
static unsigned long x=123456789,y=362436069,z=521288629,w=88675123;
unsigned long t;
t=(x^(x<<11));x=y;y=z;z=w; return( w=(w^(w>>19))^(t^(t>>8)) );
}
ttp://lucille.atso-net.jp/wiki/index.php?%CD%F0%BF%F4

15 :
Boost はほとんどテンプレートだけど、
たまにテンプレートじゃないのがあるからな。

16 :
http://www.nicovideo.jp/watch/sm1331242
歌詞を乱数で生成した歌

17 :
(ax+b) mod M でいいよ…

18 :
MT使え。
いじょ。
終了。

19 :
再開

20 :
初心者ですみません。
メルセンヌ・ツイスタって、COBOLに移植されてないでしょうか?
MTのページは見たのですがCOBOLはなかったorz

21 :
COBOLで頑張ってもいいとはおもうけど(どっかに実装があるかもしれないけど)、
処理系の、Cの関数を呼び出す機能の利用を検討するのもありと思う

22 :
>>21
ああ、おっしゃる通りですね。Cならすでにソースあるんだし。
その方向で検討します。ありがとうございました。

23 :
COBOLで乱数が必要なのか?

24 :
使えないとちょっとCOBOL

25 :
コボルと困るを掛けた駄洒落か。なるほど。次の宴会で使おう。

26 :
昔COBOLでなんちゃって正規分布乱数を作ったな
時計の1000分の一秒の値を種にして、中心極限定理を使ったはずだ
COBOLのシステムで何をするかしらんが、この程度で十分じゃねぇの?

27 :
>>25
きっと誰かのビールがCOBOLる

28 :
それは、すCOBOL、きついな。

29 :
XorShiftのk=128では無いバージョン(32,64,96,160,192)について
誰か擬似コードor参考になるURL希望。
ググったが出て来なかった(多分やり方が悪いorz)

30 :
>>29
ttp://www.jstatsoft.org/v08/i14/
ttp://www.iro.umontreal.ca/~lecuyer/myftp/papers/xorshift.pdf

31 :
ド素人なので突っ込みどころがあったら御教授くださいorz
rand()で生成した乱数をバイナリ形式で出力して
NIST SP800-22やdiehardテストに突っ込みたいんですけど・・・
↓のままだとdiehardどころかSP800-22にも引っかかってしまいます
#include <stdio.h>
#include <stdlib.h> // rand, srand使用
#include <time.h> // time使用
#define size 12000000 //bit列の長さ定義


32 :
main()
{
FILE *outputfile; // 出力ストリーム
unsigned long int m,i=0;
char bit[size];
srand((unsigned) time(NULL)); // time関数からシードをセット
outputfile = fopen("bit.dat", "w"); // ファイルを書き込み用にオープン
if (outputfile == NULL) { // オープンに失敗した場合
printf("cannot open\n"); // エラーメッセージを出して
exit(1); // 異常終了
}
for(i=0; i<size-1; i++){ // 乱数を発生させ剰余を計算
m=rand()%0xffff;
bit[i]=m;
}
fwrite(&bit,size,1,outputfile); //バイナリの書き込み
fclose(outputfile); // ファイルをクローズ
return 0;
}
↓公式ページ
NIST ttp://csrc.nist.gov/groups/ST/toolkit/rng/documentation_software.html
diehard ttp://stat.fsu.edu/pub/diehard/

33 :
>>31
rand()は乱数としての性質があまりよろしくないという
当たり前のことを文句言われてもどうかと。

34 :
>>32
> rand()%0xffff
一般論として、
剰余を取っても良質な疑似乱数列となっていることが保証されている
乱数生成系でない場合は、剰余ではなく商を取って一定の範囲に
切り詰めるべき。
歴史的に、システムのデフォルトの乱数生成系は品質の悪いものが
多いので、良い疑似乱数が必要なら、マニュアル等で良質な
乱数生成系を使っていることが確認できなければ、デフォルトの
生成系は使うべきでない。

35 :
そんなのどうでもいいじゃん
だからまあ普通はラッパーかけて開発中はrand使って
あとで精度ほしくなったら差し替えるように作るわけだが

36 :
>>33-35
早速の返答ありがとうございます。
色々とマヌケな勘違いをしていましたorz
rand()は「暗号用乱数に相応しくない乱数」の一例として示すために用いました。
剰余をとったのは、良質なRNGならば下位bitの乱数性もまた良質だろう
ということを逆説的に示すためです。
NISTに同梱されている線形合同法のRNGはテストをパスし、
逆に上記のプログラムで生成した乱数列は全く話にならなかったので、
バイナリへの変換の仕方がマズかったのかと思っていました。
NISTは線形合同法くらいなら通ってしまうと聞いたので
てっきりrand()でもイケるものだと…orz

37 :
>>36
実行はできてるんだね。
オレの環境だと>>31-32のコードは動かないんだけど。
# 原因はスタックに置くには配列サイズがでかすぎることみたいだけど。
乱数の質に絡みそうな部分というと型の選択がまずいんじゃね?
charじゃなくてunsigned charの配列にしたらどう?
それと剰余が違うんじゃね?
rand()%0xffff → rand()&0xffff でしょ。
あとループの回数も一回少ないと思う。

38 :
RAND__MAXと0xffffってどっちが大きいか知ってる?

39 :
RAND_MAXの値は実装にもよるかと。
そんなことより、rand()%0xffff → rand()&0xffff  ←こいつに誰か突っ込まんのか。

40 :
うん

41 :
そんなことよりxorshiftの話しよーぜ

42 :
unsigned long xor32(){
static unsigned long y=2463534242;
yˆ=(y<<13);y=(y>>17);return (yˆ=(y<<5));}
unsigned long long xor64(){
static unsigned long long x=88172645463325252LL;
xˆ=(x<<13);xˆ=(x>>7);return(xˆ=(x<<17));}
unsigned long xor96(){
static unsigned long x=123456789,y=362436069,z=521288629;unsigned long t;
t=(xˆ(x<<20))ˆ(yˆ(y>>11))ˆ(zˆ(z<<27))ˆ(wˆ(w>>6));x=y;y=z;z=w;return(w=t);}
unsigned long xor128(){
static unsigned long x=123456789,y=362436069,z=521288629,w=88675123;unsigned long t;
t=(xˆ(x<<11));x=y;y=z;z=w;return(w=(wˆ(w>>19))ˆ(tˆ(t>>8)));}
unsigned long xor160(){
static unsigned long x=123456789,y=362436069,z=521288629,w=88675123,v=5783321;unsigned long t;
t=(xˆ(x>>7));x=y;y=z;z=w;w=v;return v=(vˆ(v>>6))ˆ(tˆ(t>>13));}
unsigned long xor192(){
static unsigned long x=123456789,y=362436069,z=521288629,w=88675123,v=5783321,d=6615241;unsigned long t;
t=(xˆ(x>>2));x=y;y=z;z=w;w=v;v=(vˆ(v<<4))ˆ(tˆ(t<<1));return(d+=362437)+v;}
こんな具合か

43 :
コピペ丸張りで色々とおかしくなってることに気付く。
後悔はしていない。

44 :
>>40
意味とランダム度が全然違うだろ。

45 :
>>42
これってsrand()に相当する関数は自作しなきゃいかんよね?

46 :
>>45
srand_xor(int hoge)
{
extern static int x;
x=hoge;
}
これでいいんとちゃう?ん?staticはexternできなかったっけ?

47 :
>>46
アホかい。

48 :
分からなかったらとりあえずクラス化→private属性のクラス内変数で(ry

49 :
あるシードを使うと、得られる乱数を繋げたバイナリが
偶然たまたま 迷走Mind.mp3 として読めるような
乱数ジェネレータを作ったら どうだろうか。

50 :
確率的にありえない

51 :
意図的に作るんなら偶然じゃないな

52 :
PSG

53 :
>>42 には間違いがあるので注意

54 :
訂正したコードを示した方が有用なレスになると思うよ。

55 :
>>42
unsigned long xor32(){
static unsigned long y=2463534242;
y?=(y<<13);y=(y>>17);return (y?=(y<<5));}
の y=(y>>17) は y^=(y>>17) とすべき

56 :
XORってライブラリ化してないの?

57 :
めぼしいのはBoost.Randomにある

58 :
団子あげ

59 :
MTの別実装を作ってみました。
ttp://mt-lite.sourceforge.net/index.html.ja
基本のアルゴリズムはいじらず実装だけを作ったもので、
メモリ節約・リアルタイム性・スレッドセーフなどに一通り配慮したつもりです。
mt19937ar・SFMT・WELL・Xorshiftなどとの比較評価はこのあたりに:
ttp://mt-lite.sourceforge.net/doc/ja/evaluation.summary.html

60 :


61 :
SFMTのスレッドセーフ実装なら京大の人のページにあったぞ。SSE2だけだけど。

62 :
XorShiftをseed使えるようにする場合、どうすればいいかな?<何度もブン回す以外で

63 :
http://web.comlab.ox.ac.uk/oucl/work/richard.brent/random.html

64 :
>>63
thx

65 :
/* xor128()をSSE2で実装してみました。XorShift は SIMD に向かない事がわかりました。*/
#include <stdio.h>
#include <time.h>
#include <emmintrin.h>
unsigned long xor128(void){
static unsigned long x=123456789UL,y=362436069UL,z=521288629UL,w=88675123UL;
unsigned long t;t=(x^(x<<11));x=y;y=z;z=w;return(w=(w^(w>>19))^(t^(t>>8)));}
unsigned long xor128sse2(void){
static union{unsigned long v[4];__m128i m;}u={123456789UL,362436069UL,521288629UL,88675123UL};
__m128i x=u.m, w, t, r; r=_mm_slli_epi32(x,11);t=_mm_xor_si128(x,r); w=_mm_srli_si128(x,12);
x=_mm_srli_si128(x,4); r=_mm_srli_epi32(w,19);w=_mm_xor_si128(w,r); r=_mm_srli_epi32(t,8);
t=_mm_xor_si128(t,r); w=_mm_xor_si128(w,t); r=_mm_slli_si128(w,12);x=_mm_or_si128(x,r);
_mm_store_si128(&u.m,x);return(u.v[3]);}
void main(void){long i,c;
for(i=0;i<16;i++)printf("%8lx %8lx\n",xor128(),xor128sse2());
c=clock();for(i=0;i<50000000L;i++)xor128(); printf("xor128(): %4lu msec\n",clock()-c);
c=clock();for(i=0;i<50000000L;i++)xor128sse2();printf("xor128sse2():%4lu msec\n",clock()-c);}

66 :
32 行書けるんだからもうちょっと綺麗におながいします

67 :
上のほうでrand()をダイハードに食わせるとかいってた人がいたのでオチを教えておきます。
p=1.0頻発します。テストの種類によっては部分がすべてp=1.0 あわせてp=1.0みたいな。
xor128()って、例の論文に載ってるコードを組み込む場合、ライセンスはPD扱いですか?

68 :
>>65
こりゃ無茶だろ.こういう使い方は...
別の種の乱数を4個同時に生成するのが正解

69 :
>>62
xor128内部で使われてる変数x,y,z,wの中のxに、デフォルトの数値(123456789)の変わりに
与えられたseed値を代入するようにしてみた。
一応ちゃんと動作してるっぽいが統計的に良いのか悪いのかはよく分からん

70 :
>>69
初期値ってあの値じゃなくても良かったのね。
乱数の質がどの程度変わるのかが気になるが

71 :
やっつけでtimeの値入れたり

72 :
SEED値を入れるならxよりwの方がいい気がする

73 :
/* >>68 さん。的確なアドバイスありがとうございます。>>68 さんの方法で書いてみました。*/
/* 種で初期化する関数付き。XorShift の SSE2 による高速化はあきらめるしかないのか! */
#include <stdio.h>
#include <time.h>
#include <emmintrin.h>
unsigned long xor128(void) {
static unsigned long x=123456789UL,y=362436069UL,z=521288629UL,w=88675123UL;
unsigned long t;t=(x^(x<<11));x=y;y=z;z=w;return(w=(w^(w>>19))^(t^(t>>8)));}
int idx=4; union { unsigned long v[4]; __m128i m; }
x={123456789,123456789,123456789,123456789},y={362436069,362436069,362436069,362436069},
z={521288629,521288629,521288629,521288629},w={ 88675123, 88675123, 88675123, 88675123};
void sxor128x4(unsigned long s)
{int i; for (idx=4,i=0;i<16;i++) x.v[i]=s=1812433253*(s^(s>>30))+i; }
unsigned long xor128x4(void) { __m128i t,r,s;
if (idx==4) { r=_mm_slli_epi32(x.m,11); t=_mm_xor_si128(x.m,r); x.m=y.m; y.m=z.m;
s=z.m=w.m; r=_mm_srli_epi32(s,19); s=_mm_xor_si128(s,r); r=_mm_srli_epi32(t,8);
t=_mm_xor_si128(t,r); s=_mm_xor_si128(s,t); w.m=s; idx=0; }
return(w.v[idx++]); }
void main(void){ long i,c;
for (i=0;i<9;i++) printf("%8lx %8lx %8lx %8lx %8lx\n",
xor128(),xor128x4(),xor128x4(),xor128x4(),xor128x4() );
for (sxor128x4(1),i=0;i<9;i++)
for (printf("\n"),c=0;c<4;c++) printf("%8lx ",xor128x4() );
for (c=clock(),i=0;i<100000000L;i++) xor128();
printf("\n(xor128():%lu msec), ",clock()-c );
for (c=clock(),i=0;i<100000000L;i++) xor128x4();
printf("(xor128x4():%lu msec)\n",clock()-c ); }

74 :
>>73
その種の使い方、MTと全く同じだな

75 :
XorShiftの正しいシードの設定方法を教えてくれ!

76 :
論文の6ページ目に xor128 の seed set は全て0の場合を除いて、どの
ように設定してもよいと書いてある。しかし、極端な設定をすると不自然
な部分列が出力される。そこで初期化の方法はMTを参考にした。iを0
からではなく1から始めた理由は0を種にしたときに最初の2つの出力が
似た値にならないようにするためである。配列を使っているが、スピード
はオリジナルとほとんど変わらない。コンパイラによっては、こちらの方
が速くなる場合もある。デフォルトの初期ベクトルは rand,srand になら
って種を1としたときと同じである。
unsigned long MyVec128[4]=
{ 1812433254UL, 3713160357UL, 3109174145UL, 64984499UL };
void MySeed128(unsigned long s)
{
int i;
for (i=1;i<=4;i++) MyVec128[i-1]=s=1812433253UL*(s^(s>>30))+i;
}
unsigned long MyXor128(void)
{
unsigned long *a=MyVec128, t=a[0], w=a[3];
a[0]=a[1]; a[1]=a[2]; a[2]=w;
t^=t<<11; t^=t>>8; w^=w>>19; w^=t; a[3]=w; return w;
}

77 :
なるほど、どんな初期値であっても、2^128-1のどこかの部分列になってるのか

78 :
>>61について誰か詳しく頼む

79 :
ん? 何が分からなかった?

80 :
遅いんだよ
もういい

81 :
はやっ

82 :
こんな過疎スレで遅い言われても

83 :
自分がいくら張り付いてるからって、ね。

84 :
>>61のソースの所在教えてくれ
パクる

85 :
dSFMTだったごめん。
http://nct.brain.riken.jp/~takekawa/softwares.xhtml
あとこんなのもあった。
http://charles.karney.info/random/

86 :
thx

87 :
ダンゴさんはSSEネタには造詣が深いな。

88 :
じゃあ上げとこ

89 :
シミュ板、数学板に乱数スレ発見。
乱数
http://science6.2ch.net/test/read.cgi/sim/1100375806/
乱数の生成方法を必死になって考えるスレ 
http://science6.2ch.net/test/read.cgi/math/1203153071/

90 :
あげ

91 :
XORSHIFTって、その出力の剰余を取った場合も
良質なランダム性があるって言われているのでしょうか?

92 :
XORSHIFTは良質ではないと思います

93 :

工工エエエエエ(´Д`)エエエエエ工工

94 :
MTが一番良質と思います XORは速度は速いです 用途によっては十分です

95 :
>>91です。
XORSHIFTで剰余を取った時の結果を載せてる
WEBページを見た気がするのですが、結果が
今一だったような記憶が・・・
自分でも試してみようと思っているのですが、
理論的には説明出来そうにないし。

96 :
>>95
そのWEBページのURL教えてくれ

97 :
>>96
個人のブログですが、確かここだったと思います。
ttp://d.hatena.ne.jp/Isoparametric/20070830/1188462129
今、改めて読んでみると、よく意味分からん・・・

98 :
たった100回回しただけなら偏りも出るだろう

99 :
はぐれめたるは捕まえられますか?

100read 1read
1read 100read
TOP カテ一覧 スレ一覧 2ch元 削除依頼
Git 4 (622)
C言語の第一歩 (843)
データベースプログラミング全般スレ (376)
【ねらーの】HSPで人工知能を作るスレ【意地】 (653)
VB6でLinuxを作る方法を教えてください!! (203)
SDL=Simple DirectMedia Layerでゲームだ (523)
--log9.info------------------
▲猫イラネはズニア担の総意▲ (904)
記念171 (506)
【コテ限】予想・雑談スレッド16【ハン定】 (910)
【速報】加倉はハゲ (300)
【華麗に千切れて!!!】本日の千切れ選手3 (227)
【郡司教官】 乞食選手スレ 5 【親子競演】 (343)
【脚がない】小野俊之 8【引退勧告】 (367)
記念競輪総合スレッド217 (1001)
【未だ一冠】 深谷知広 15擁護 【打倒脇本】 (262)
【突撃!ゆみさんの晩御飯】伏見俊昭18【スイ婆発狂】 (773)
【暇つぶし】続々・競輪しりとり【過疎対策】 (763)
【飛天ちゃん】奈良競輪場【特観なし】 (877)
【ガールズケイリン】女子競輪4【2012年7月Debut】 (474)
【疲れを癒す】村上義弘/村上博幸【松本ドリンク】 (926)
メモメモφ(・_・") (485)
【ヤマコウ】選手会支部長スレ【お説教部屋2】 (866)
--log55.com------------------
【名探偵コナン】工藤新一ファンスレ【クールガイ】
僕のヒーローアカデミア強さ議論スレ
ラストが斜め上になりそう&なった漫画
ロリコンにおすすめなマンガ 1冊目
ここだけ漫画のパターンが通用しないスレ11
【褐色の剣聖】ビョトン・コーララ【純血の騎士】
テスト
川´⊇`)かわいかったよ川´⊇`)【BLEACH】17