1read 100read
2012年08月プログラム115: 疑似乱数2 (438) TOP カテ一覧 スレ一覧 2ch元 削除依頼
Google NaCl プログラミング 2mol (283)
MVVMについて語ろう (556)
VB.NET質問スレ(Part39) (543)
【Lua】組み込み系言語総合 その5【Squirrel】 (882)
推薦図書/必読書のためのスレッド 69 (278)
関数型言語ML (SML, OCaml, etc.), Part 6 (593)

疑似乱数2


1 :2007/10/17 〜 最終レス :2012/11/22
擬似乱数発生器について語ろうか。その2
前スレ
擬似乱数
http://pc11.2ch.net/test/read.cgi/tech/1146071975/
関連スレ
【危険】とんでもプログラムRスレッド【悪質】
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元 削除依頼
正規表現 Part10 (447)
Eclipse統合M33【Java/C++/Ruby/Python/Scala】 (593)
Embarcadero RAD Studio/Delphi/C++Builder その3 (570)
推薦図書/必読書のためのスレッド 69 (278)
プログラミング言語 Scala 8冊目 (607)
【モダン推奨】Perlについての質問箱 50箱目 (398)
--log9.info------------------
埼玉でカブクワ採れる場所は?★3 (253)
シミ全般 (370)
虫殺しました (806)
【不快害虫】   チャタテムシ   【駆除困難】 (938)
ゴキブリがあらわれた (581)
ゴキブリ大好きデス (738)
■ コオロギを見たら age るスレッド (270)
多摩地区周辺でのクワガタ・カブト採集 2匹目 (707)
温室について深く語る (646)
尿道に虫が入ってしまいました。 (496)
★宮城県でのクワガタ・カブト採集情報★ (429)
コーカサス【カルコソマ・アジア最強】アトラス2 (645)
新年早々最悪の福袋を出す店を暴露しましょう! (828)
関東以北のクマゼミ情報 (521)
クマゼミは害虫です (211)
■■【頭幅】ホペイについて語るスレ6【顎先】■■ (564)
--log55.com------------------
【聯合ニュース】対日旅行収支の赤字拡大 訪日韓国人が訪韓日本人の3倍消費=15〜18年[10/6]
【文大統領】「ソウル・平壌共同五輪開催に在外同胞の力を貸してほしい」「『世界韓人の日』がさらに意味深く迫ってくる」[10/6]
【中央日報】日帝収奪と産業化の象徴、長項製錬所周辺を生態空間として再生=韓国 煙突から出たヒ素など重金属が汚染の主犯だった[10/6]
【国際】台湾の外交関係を堅固に 台米間の「太平洋対話」台北で初開催へ 日本、新西、豪、加、欧州各国の駐台代表も参加の可能性[10/5]
【韓国】栄養満点『青陽の栗』・・・米国と日本に輸出[10/06]
【米韓】 在米大韓帝国公使館、工事代金未納で抵当権設定 [10/07]
【ラグビー】ラグビー日本代表全員が「君が代」を歌えるワケ 2019/10/06
【親日が愛国】と発言した韓国文化体育観光部局長が罷免される=韓国ネット「日本で公務員になったら?」[10/07]