TOP カテ一覧 スレ一覧 100〜終まで 2ch元 削除依頼
vbs初心者なんですが
起業しようぜ8
C# vs Java どっちが好き? その5
プログラミングのやる気出す方法教えてくれ
TopCoder
関数型プログラミング言語Haskell Part33
ATL/WTL Part7
■特許庁新システムを作る■
スレ立てるまでもない質問はここで 153匹目
Vue vs React vs Angular Part.2

疑似乱数2


1 :2007/10/17 〜 最終レス :2019/02/24
擬似乱数発生器について語ろうか。その2
前スレ
擬似乱数
http://pc11.2ch.sc/test/read.cgi/tech/1146071975/
関連スレ
【危険】とんでもプログラムKスレッド【悪質】
http://pc11.2ch.sc/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.sc/test/read.cgi/sim/1100375806/
乱数の生成方法を必死になって考えるスレ 
http://science6.2ch.sc/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 :
はぐれめたるは捕まえられますか?

100 :
>>99
むり


100〜のスレッドの続きを読む
ふらっと C#,C♯,C#(初心者用) Part142
ふらっと C#,C♯,C#(初心者用) Part127
Excel VBA 質問スレ Part62
2進数や16進数を覚える意味がわからない
【汚物】痛い変数名・関数名【破廉恥】
VRプログラム雑談【Unity/UnrealEngine】【HTC Vive/Oculus Rift/その他VR】
シェルスクリプト総合 その33
米国国防省の標準高等言語エイダ(Ada)を語れ!
マルチプラットフォーム プログラミング言語 haXe
【O3D】HTML5用 3D API WebGL 【Canvas:3D】
--------------------
【Rainbow】ユネ応援スレ☆1【Yoon Hye】
【PS4/PS3/PSV】英雄伝説 閃の軌跡総合 part 705
【アリスギア】アリス・ギア・アイギス Part233
近畿の高校野球707
葉村哲☆20【××します/鎧の姫君/バロック/一乃/天川/ぼっち】
みんな大好き闘将ダイモスの思い出
方言を使って雑談するスレ
【臭肛門】介護の雑談・相談・質問 62【臭R】
【avex】 Q'ulle(キュール) 31曲目 【踊ってみた】
全力!脱力タイムズ 20
【速報】沖縄・名護市議選 オール沖縄側の辺野古反対派が議席落として過半数ならず 勢力が拮抗状態に
ウエーーハハハハハ
株で確実に勝てる方法を見つけたかも
東京に引っ越してきて後悔したこと
【医学部医師家庭】幼稚園、小学校受験 1
草刈機・刈払機について語ろう! Part85 (ワッチョイ ナシ)
デスクトップ板「全板人気トーナメント結果がでた
中学生のパンチラの思い出4
「夜の」をつけて卑猥な雰囲気を醸し出すスレ@ロンドン
【極楽】同人誌専門書店員の休憩所【地獄】六勤目
TOP カテ一覧 スレ一覧 100〜終まで 2ch元 削除依頼