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 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));}
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; }
/* Complementary Multiply With Carry */ void initialize( unsigned long ); unsigned long cmwc( void ); enum { A = 3636507990, B = 0xffffffff, R = 1024 }; unsigned long seed[ R ], index, c;
void initialize( unsigned long n ) { unsigned long i; for (i=0; i<R; i++) { seed[ i ] = n; n = n * 1103515245 + 12345; } index = c = 0; } unsigned long cmwc( void ) { unsigned long x; unsigned long long t; t = (unsigned long long)seed[ index ] * A + c; x = B - (unsigned long)( t & B ); c = (unsigned long)( t >> 32 ); seed[ index ] = x; if ( ++index >= R ) index = 0; return x; } 0109デフォルトの名無しさん2008/05/03(土) 21:01:47>>105 http://www.astr.tohoku.ac.jp/~ajiki/cheap_restaurant/GAME/SAGA2/saga2rand.html サガ2の乱数発生器
Debian JPプロジェクトのアナウンス ttp://www.debian.or.jp/blog/openssl_package_and_its_vulnerability.html 0111デフォルトの名無しさん2008/05/19(月) 09:17:00 まとめ乙 0112デフォルトの名無しさん2008/08/06(水) 01:14:02 保守 0113デフォルトの名無しさん2008/08/09(土) 20:00:17 M系列という単語を見かけたので、理解してないまま保守リンク http://pc11.2ch.net/test/read.cgi/tech/1158367586/751-0114デフォルトの名無しさん2008/08/11(月) 14:05:33 VBAで、dll使わずに高機能な乱数を実装する方法はないですか? XorShiftを使うには、長桁計算しかないですか? 0115デフォルトの名無しさん2008/08/13(水) 17:47:46 ' Xorshift を VBA で書く場合、Double を使うと比較的シンプルになる ' VBA の演算子 Xor と関数 Fix は 31 bit までしか扱えないので ' 53 bit まで扱える関数 uFix、uXor を用意した。 Option Explicit Public x, y, z, w As Double
Function uFix(ByVal x As Double) As Double Const Base = 2# ^ 22 Dim y As Long y = Int(x / Base): uFix = y * Base + Int(x - y * Base) End Function
Function uXor(ByVal i As Double, ByVal j As Double) As Double Const Base = 2# ^ 22 Dim u, v As Long u = Int(i / Base): v = Int(j / Base): i = i - u * Base: j = j - v * Base uXor = (u Xor v) * Base + (Int(i) Xor Int(j)) End Function
Function xor128() As Double Dim t As Double t = x * 2# ^ 11: t = t - Int(t / 2# ^ 32) * 2# ^ 32 t = uXor(x, t): x = y: y = z: z = w: t = uXor(t, uFix(t / 2# ^ 8)) w = uXor(uXor(w, uFix(w / 2# ^ 19)), t): xor128 = w End Function
Sub Test() Dim i As Long x = 123456789#: y = 362436069#: z = 521288629#: w = 88675123# For i = 1 To 2000: Cells(i, 1) = xor128: Next End Sub 01161152008/08/13(水) 18:47:55 ' 書き込んだ後、uFix は必要がないことに気づきました。 ' こっちの方が高速です。 Option Explicit Public x, y, z, w As Double
Function uXor(ByVal i As Double, ByVal j As Double) As Double Const Base = 2# ^ 30 Dim u, v As Long u = Int(i / Base): v = Int(j / Base): i = i - u * Base: j = j - v * Base uXor = (u Xor v) * Base + (Int(i) Xor Int(j)) End Function
Function xor128() As Double Dim t As Double t = x * 2# ^ 11: t = t - Int(t / 2# ^ 32) * 2# ^ 32 t = uXor(x, t): x = y: y = z: z = w: t = uXor(t, Int(t / 2# ^ 8)) w = uXor(uXor(w, Int(w / 2# ^ 19)), t): xor128 = w End Function
Sub Test() Dim i As Long x = 123456789#: y = 362436069#: z = 521288629#: w = 88675123# For i = 1 To 2000: Cells(i, 1) = xor128: Next End Sub 0117デフォルトの名無しさん2008/08/18(月) 18:18:26>>116 114です、ありがとうございます。32bitのXorShiftですね。
で、周期の途中から乱数を取り出して使いたいのですが、 x,y,z,wの初期値を乱数で設定するのに、デフォルトのrnd()を使ったら無意味ですよね。 0118デフォルトの名無しさん2008/08/19(火) 00:23:17>>75あたりか 01191152008/08/22(金) 21:40:15 '種を使って初期化できます。116よりさらに2倍程度高速になりました Private Const p32 = 2# ^ 32, p31 = 2# ^ 31, p21 = 2# ^ 21, p11 = 2# ^ 11 Private Const m53 = 2# ^ -53, m32 = 2# ^ -32, m30 = 2# ^ -30, m19 = 2# ^ -19, m11 = 2# ^ -11, m8 = 2# ^ -8 Private x, y, z, w As Double Private f As Boolean Private Function uXor(ByVal x As Double, ByVal y As Double) As Double Dim u, v As Long If x >= p31 Then u = x - p32 Else u = x If y >= p31 Then v = y - p32 Else v = y u = u Xor v If u < 0 Then uXor = u + p32 Else uXor = u End Function Private Function XSub(ByVal x As Double, ByVal i As Long) As Double Dim s As Variant s = CDec(1812433253) * CDec(uXor(x, Int(x * m30))) + CDec(i): s = s - CDec(Int(s * m32)) * CDec(p32): XSub = s End Function Public Sub InitXor(ByVal s As Long) ' s を種にして乱数を初期化する f = True: x = XSub(s, 1): y = XSub(x, 2): z = XSub(y, 3): w = XSub(z, 4) End Sub Private Function NextXor() As Double Dim t As Double If f = 0 Then InitXor (1) t = x * p11: t = t - Int(t * m32) * p32: t = uXor(x, t): x = y: y = z: z = w: t = uXor(t, Int(t * m8)): w = uXor(uXor(w, Int(w * m19)), t): NextXor = w End Function Public Function NextUnif() As Double ' 0 以上 1 未満の乱数を返す Dim x, y As Double x = NextXor * m11: y = NextXor: NextUnif = (y * p21 + Int(x)) * m53 End Function 0120デフォルトの名無しさん2008/08/22(金) 23:22:43 xorshiftって周期とか分布の保証ってあるの? もしないならM系列の方がましだと思うんだけど。 ググれば長周期の多項式も見つかるし。 0121デフォルトの名無しさん2008/08/23(土) 01:50:28 劣化M系列と理解してるが 0122デフォルトの名無しさん2008/08/23(土) 02:50:13 早くて軽くてrandよりマシ 0123デフォルトの名無しさん2008/08/25(月) 16:31:11>>119 excelVBAじゃ初期化するための種が結局16bitしかないんだから Xorshiftの種も16bit種類しかなくならね? 01241192008/08/27(水) 03:32:41 種 s は Long なので32bit種類あるが、負の場合は試してないので実質31bit種類。 0125デフォルトの名無しさん2008/08/27(水) 10:43:09 VBAのRandomizeが16bit種類 それを使って初期化後rnd()で取得できる乱数も16bit種類 XorShiftの種にそれらを使うのなら結局系列は16bit種類
と、コード見ないで言ってみる 0143デフォルトの名無しさん2008/09/25(木) 17:39:27 flashのActionScriptの乱数Math.randomって何bit? 0144デフォルトの名無しさん2008/09/25(木) 22:19:58 25くらい 0145デフォルトの名無しさん2008/09/29(月) 11:00:47 MTならFORTRANだけど ttp://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/VERSIONS/FORTRAN/fortran.html この中に revrand(): it generates prn in reverse order って書いてあるけど 0146デフォルトの名無しさん2008/10/05(日) 13:52:49 MTの巻き戻しのフォートランをCに移植してみた。
#define main dummy #include "mt19937ar.c" #undef main
unsigned long revgrnd(void) { static unsigned long mag01[2]={0x0UL,MATRIX_A}; unsigned long y=mt[--mti],z,p,q,mt0L,mt0; int x,kk; if (mti==0) { z=mt[N-1]^mt[M-1]; x=(int)(z>>31); y=z^mag01[x]; p=(y<<1)|x; mt0L=LOWER_MASK&p; mt[0]=(mt[0]&UPPER_MASK)^mt0L; mt0=mt[0]; for (kk=N-1;kk>N-M;kk--) { z=mt[kk-1]^mt[kk-1+M-N]; x=(int)(z>>31); y=z^mag01[x]; q=(y<<1)|x; mt[kk]=(UPPER_MASK&p)|(LOWER_MASK&q); p=q; } for (;kk;kk--) { z=mt[kk-1]^mt[kk-1+M]; x=(int)(z>>31); y=z^mag01[x]; q=(y<<1)|x; mt[kk]=(UPPER_MASK&p)|(LOWER_MASK&q); p=q; } mt[0]=(UPPER_MASK&p)|mt0L; y=mt0; mti=N; } y^=(y>>11); y^=(y<<7)&0x9d2c5680UL; y^=(y<<15)&0xefc60000UL; y^=(y>>18); return y; }
int main(void) { int i; static unsigned long x[5000],y[5000]; for (i=0;i<5000;i++) x[i]=genrand_int32(); for (i=4999;i>=0;i--) y[i]=revgrnd(); for (i=0;i<5000;i++) if (x[i]!=y[i]) { printf("ERROR\n"); break; } for (i=0;i<10;i++) printf("%08lx %08lx\n",x[i],y[i]); return 0; } 0147デフォルトの名無しさん2008/10/22(水) 21:18:38 とつげき東北とかいう人の乱数生成法を見て思いついたけど メモリを確保して、読み書きする速度を計測すれば真の乱数できそう。 もともとはハードディスクの読み書きだが。これだと生成に時間食う。 0148デフォルトの名無しさん2008/10/22(水) 21:20:08 これね。
ハードウェア乱数生成ルーチンhdrand.c http://www.interq.or.jp/snake/totugeki/hdrand.htm 0168デフォルトの名無しさん2009/01/05(月) 13:49:11 概要をコピペ > テンポラリファイルフォルダにファイルを作成・削除し、その処理にかかった時間 > を高分解能パフォーマンスカウンタで計測して、処理時間を得る。 > 処理時間のビット列のうち、偏らないビットを乱数ビットとして利用する。 > ハードディスクのシーク時間や物理的な書き込み速度は、キャッシュや温度や湿度や > Windowsの処理順などによってばらつきがあるので、良質なランダムビットがとれる。 > 測定されるビットの変化を最初にテストしておくことで(100回のビット発生で、 > 充分に変化が見られたビットだけを乱数に使用する)、処理速度の違いや、パフォーマンスカウンタの質の悪さ(例えば最下位ビットが必ず偶数や奇数になる可能性)も吸収できる。 0169デフォルトの名無しさん2009/01/05(月) 15:42:33 WindowsってOSにこのてのメカニズム持ってないのか? 0170デフォルトの名無しさん2009/01/05(月) 17:21:26 ん、こういうの俺も昔遊びで作った事がある。 0171デフォルトの名無しさん2009/01/05(月) 23:24:02 SFMTをExcelで使うなら、シード値ってどうやりゃいい? sgenrand Timer * 1000 なんてのがどっかにあったが、なんかいまいちだよな。 0172デフォルトの名無しさん2009/01/06(火) 00:12:34>>169 ハードウェア使った処理が含まれているかどうかは分からないけど、 暗号論的に安全なのが欲しければ、CryptGenRandom使えということになっている。 0173デフォルトの名無しさん2009/03/09(月) 06:06:19>>166の続き。ffmpegではMT (Mersene twister)の質が悪く遅いということで非推奨(deprecated)にされました。質が良いのを使いたいならMLFGやKISS99を使えとのこと。 http://lists.mplayerhq.hu/pipermail/ffmpeg-cvslog/2009-March/021108.html0174デフォルトの名無しさん2009/03/09(月) 20:38:50 何が問題なんだろ。 松本さんの実装は、内部状態が1周した時に一斉に計算するようになってるので、 負荷が一定しないよなぁとは思うんだが、そういうとこじゃなくて、原理的に問題が ある、っつってんだよね。 遅いというのは、はあそうですか、というだけなんだけど、blogのほう見ると、 XOR だけで構成されている、ってことをdisってるように見えるんだが... 0175,,・´∀`・,,)っ-○◎●2009/03/09(月) 20:41:31 KISS99もシンプルだし悪くはないんだが 0176デフォルトの名無しさん2009/03/10(火) 00:23:48>>174 ブログで参照しているこのペーパーにあるMT19937のテスト結果がCrash 2回、BigCrash 2回になっているからだからだと思う。 http://www.iro.umontreal.ca/~lecuyer/myftp/papers/testu01.pdf 誰か解説キボン 0177デフォルトの名無しさん2009/03/10(火) 00:55:31 どんなアルゴリズムであっても一周期において均等分布を達成するとなると 全てのビットパターンを発生させるという点で結局M系列と同じ事になるんだよな。 するとマクロではみんな十分にランダムということになるから、 あとはミクロでのランダムさとその実装方法からくる計算量が問題なわけだな。 そのあたりに何かあるんじゃなかろか。 0178デフォルトの名無しさん2009/03/10(火) 11:49:47 なんかその論文で提案してるテストでは、暗号学的な強度のあるジェネレータ以外は のきなみパーフェクトでない結果を出してるみたいだ。 MTの成績が際立って悪いとかそういう結果ではないけど、ffmpegの作者的には 気になる結果なのかな? 0179デフォルトの名無しさん2009/03/12(木) 22:15:08 元々そちらの専門家みたい 0180デフォルトの名無しさん2009/04/17(金) 14:38:32 ダメ 0181デフォルトの名無しさん2009/06/20(土) 20:18:13http://en.wikipedia.org/wiki/Mersenne_twister#Alternatives >The Mersenne Twister algorithm has received some criticism in the computer science field, notably by George Marsaglia. >These critics claim that while it is good at generating random numbers, it is not very elegant and is overly complex to implement. >Marsaglia has provided several examples of random number generators that are less complex yet which he claims provide significantly larger periods. >For example, a simple complementary multiply-with-carry generator can have a period 10^33000 times as long, be significantly faster, and maintain better or equal randomness.[5][6]
でも実際に相関がないことを証明する必要があると面倒ですね。 plot(rand mod 640,rand mod 400,rand mod 16) とかでとびとび直線が出てびっくりですよ 0246デフォルトの名無しさん2010/01/11(月) 20:48:42>>245 数理的な意味でのカオスってのは、テント写像に代表されるように 小数点以下を無限に汲みだす漸化式になっているから予測が難しいのであって、 種が有限桁数であっては成立しない。
The result of E1 >> E2 is E1 right-shifted E2 bit positions. If E1 has an unsigned type or if E1 has a signed type and a nonnegative value, the value of the result is the integral part of the quotient of E1 divided by the quantity, 2 raised to the power E2 . If E1 has a signed type and a negative value, the resulting value is implementation-defined. 0305デフォルトの名無しさん2010/11/08(月) 10:40:27 よかった、ほっとした 0306デフォルトの名無しさん2010/11/08(月) 12:09:17 そりゃunsignedなのに上から1が降ってきたら誰だってビビるわ 0307デフォルトの名無しさん2010/11/08(月) 12:14:17 算術シフトしかないCPUで、シフト演算はのんきに全部その命令を生成しちゃう コンパイラだってあるかもしれんし、Cの仕様はそれすらimplementation-definedと 言っていそうな雰囲気がある。この場合は違ったわけだが。 0308デフォルトの名無しさん2010/11/12(金) 23:22:51 たまにはキャリーさんのことも思い出してあげて 0309デフォルトの名無しさん2010/11/13(土) 09:26:39 キャリーをさがせ 0310デフォルトの名無しさん2011/01/18(火) 01:52:26 NIST検査について質問です。乱数の統計的性質を調べるソフトなのですが、 このテストをすべて合格しないと乱数とは言えないのでしょうか? 特にFFT検査の場合に不合格になります。周期はないと思うのですが、なぜか うまくいきません。それとも、これだけは絶対に通らなくてはいけないという 検査があるのでしょうか。どなたかご教示願います。 0311デフォルトの名無しさん2011/01/19(水) 01:13:06 テストに合格しようがしまいが乱数は乱数じゃね? 0312デフォルトの名無しさん2011/01/19(水) 01:42:36 二回(以上)続けて同じ数字が出ないものは乱数と呼びたくないな 0313デフォルトの名無しさん2011/01/19(水) 09:31:42>>312 >>284-2880314デフォルトの名無しさん2011/01/19(水) 16:52:17 疑似乱数に詳しくない俺が言うべきじゃないのかもしれないけど 乱数と疑似乱数を分けて考えてない人が居るような気がするんだ。 乱数、たとえばサイコロとかで作った乱数なら2回以上続けて6が出ることもあるでしょ。 でも線形合同法とかの疑似乱数は、同じ数が2回続けて出ることはないし、 循環しちゃうし乱数とは別物じゃない。だから、疑似と真の区別をはっきりさせないと 話がかみ合わなくなる気がするんだ。 0315デフォルトの名無しさん2011/01/19(水) 17:03:32 本当にわかってないな 0316デフォルトの名無しさん2011/01/19(水) 17:14:01 一気に糞スレ化したね。 0317デフォルトの名無しさん2011/01/19(水) 17:53:20>>315 何処がどう分かってないのかハッキリさせないと、その発言に意味はないと思いますよ。 意味のない発言の塊が2chなわけですけど 0318デフォルトの名無しさん2011/01/19(水) 17:55:41 314は巨大な状態空間の一部だけ切り出してる擬似乱数が想像できないんだろ 0319デフォルトの名無しさん2011/01/19(水) 18:20:58>>317 >>3130320デフォルトの名無しさん2011/01/19(水) 18:39:02>>318 そういうのは自分で考えさせないと 03213142011/01/19(水) 19:16:42>>318、320 よく分からないんですが、疑似と真乱数を分けて考える必要はないということですか? 0322デフォルトの名無しさん2011/01/20(木) 00:03:34 何故区別する必要があると思ったの? 問題の出てくる例を挙げて欲しい。 0323デフォルトの名無しさん2011/01/20(木) 00:15:30 えさを与えないでください 03243142011/01/20(木) 01:23:19>>322 そもそもこの2つは別物なのにその2つを同じ言葉で表すのが気持ち悪いと感じるんですよ。 >>310は疑似乱数のテストについて質問していて、>>311、312は真乱数を前提に 話してるみたいだし、>>313は疑似乱数を前提に発言してる。どうも疑似と真を分けてないから 話が噛合ってないように見えるんですよ 0325デフォルトの名無しさん2011/01/20(木) 01:54:43 スルーしてください 0326デフォルトの名無しさん2011/01/20(木) 05:00:53 スレタイも読めないヤツに何かが分かるなんて期待するヤツはいない。 0327デフォルトの名無しさん2011/01/20(木) 17:55:54 わざと答えをはぐらかしてるみたい 0328デフォルトの名無しさん2011/01/20(木) 18:03:55 324は正しい 0329デフォルトの名無しさん2011/01/20(木) 18:06:56 乙です 0330デフォルトの名無しさん2011/04/16(土) 11:03:07.44 George Marsaglia (1924 - 2011) ttp://www.legacy.com/obituaries/tallahassee/obituary.aspx?n=george-marsaglia&pid=148777353 0331デフォルトの名無しさん2011/04/16(土) 11:16:55.91 age 0332デフォルトの名無しさん2011/05/18(水) 23:19:05.17 乱数で数値nの約数の合計って使えないの? 結構バラバラなんだけど 0333デフォルトの名無しさん2011/05/18(水) 23:21:48.27 とりあえず検定の結果を示してもらわんとなんとも。
それで線形合同法の推奨されてるパラメータを越える成績ならともかく。 0334デフォルトの名無しさん2011/05/18(水) 23:58:05.10 数値nをどこから持ってくるのか詳しく聞かせてもらおうじゃないか 0335デフォルトの名無しさん2011/05/19(木) 16:36:50.88 ぶっちゃけそこはn=n+(秒針)みたいなでいいと思う あとn/2/(nの約数の合計)なら多分1〜0しかでない 0336デフォルトの名無しさん2011/06/12(日) 19:32:33.48 RDRANDで疑似乱数オワタ? 0337デフォルトの名無しさん2011/06/12(日) 21:41:33.09>>336 http://software.intel.com/file/36945 >8.6 >RDRAND returns random numbers that are supplied by a cryptographically secure, >deterministic random bit generator (DRBG). The DRBG is designed to meet the NIST >SP 800-90 standard. The DRBG is re-seeded frequently from a on-chip non-deterministic >entropy source to guarantee data returned by RDRAND is statistically >uniform, non-periodic and non-deterministic. 超訳: RDRAND 命令は、暗号論的に安全である**決定的な**ランダムビット生成器(DRBG)により供給される乱数を返す。 DRBG は NIST SP 800-90 http://csrc.nist.gov/publications/nistpubs/800-90/SP800-90revised_March2007.pdf に適合するように設計されている。 DRBG はチップに内蔵されている非決定的なエントロピー源により、定期的に初期値を再与されているため、 その結果、RDRAND命令は統計的に均一かつ非周期的、非決定的なデータを生成することが保証されている。
オンチップ-エントロピー源の出来如何に関わるという印象を受けますが、さて、どうでしょうか? 0338デフォルトの名無しさん2011/06/12(日) 22:06:24.66 なんで擬似乱数が終わるんだよ? 分からない奴は黙っとけ 0339デフォルトの名無しさん2011/06/12(日) 22:08:35.00 容易に再現できる乱数列が必要な応用があるとか全く知らないんだろ 0340デフォルトの名無しさん2011/06/16(木) 00:25:21.98 #include <stdio.h> #include <stdlib.h> #include <pthread.h> #define NUM_THREAD 8 void *th_main(void *arg){ unsigned i, sum = 0; for(i = 0; i < 1000; i++) sum += rand(); printf("Thread#%d: sum = %u\n", pthread_self(), sum); } int main(){ int i; pthread_t th[NUM_THREAD]; srand(time(NULL)); for(i = 0; i < NUM_THREAD; i++) pthread_create(&th[i], NULL, th_main, NULL); for(i = 0; i < NUM_THREAD; i++) pthread_join(th[i], NULL); return 0; }
/* Implementation of a 32-bit KISS generator which uses no multiply instructions */ static unsigned int x=123456789,y=234567891,z=345678912,w=456789123,c=0; unsigned int JKISS32() { int t; y ^= (y<<5); y ^= (y>>7); y ^= (y<<22); t = z+w+c; z = w; c = t < 0; w = t&2147483647; x += 1411392427; return x + y + w; } 0409デフォルトの名無しさん2011/12/30(金) 16:57:53.03 129ビットぶんの状態があるように見えるけど周期は2^121なのか 加算の使い方がまたなんとも 0410デフォルトの名無しさん2012/01/02(月) 18:16:00.13 L・C・G!L・C・G! 0411デフォルトの名無しさん2012/07/24(火) 08:00:03.47 wikipediaにある '特定の範囲で乱数を求めたいときにはa = rand() % 10とする方法も広く知られているが、線形合同法などの下位ビットの乱数としての品質が低い生成法に備えるため上記のコード例のような上位にあるビットを利用するコードが推奨されている' ってどいういうこと? (int)((rand() / ((double)RAND_MAX+1.0)) * 2); と rand()%2 で1000000回、乱数を生成して比較してみたけど、平均値と0.5の差はどちらもオーダー的にほとんど変わらないのだけど、 0412デフォルトの名無しさん2012/07/24(火) 08:24:36.56 面倒だから 乱数 下位ビット でググってもらっていいかな。 0413デフォルトの名無しさん2012/07/24(火) 08:26:01.03>>411 品質が悪いと、奇数偶数が交互にしか出なかったりする。 0414デフォルトの名無しさん2012/07/24(火) 09:00:13.60>>412
つーか、言語も何も判らんのに答えられるわけないとは思わないもんなのだろうか。 0437デフォルトの名無しさん2012/11/20(火) 13:27:08.91 回答もランダムです 0438デフォルトの名無しさん2012/11/22(木) 12:27:29.80 MATLABやRならrandはメルセンヌツイスタになってるよw 0439デフォルトの名無しさん2013/01/07(月) 21:11:37.12>>429だな。 少なくともオフィシャルの実装には配列でシードを与える関数がある。 0440デフォルトの名無しさん2013/02/23(土) 22:05:49.43 static uint64_t x = seed; x ^= x << 21; x ^= x >> 35; x ^= x << 4; return (uint32_t)x; // doesnt pass 0441デフォルトの名無しさん2013/02/24(日) 04:19:20.32 そのまま返しちゃだめです 0442デフォルトの名無しさん2013/09/27(金) 00:20:23.10 Kiss99ってのがあるのをここで見て調べたら、L'Ecuyerがそう呼んだだけだった。 つまり、Marsagliaが1999年にユースネットへ投稿した有名な「挑戦状」、 'Random numbers for C: End, at last?' で紹介されていた'KISS(Keep It Simple Stupid)'のことだった(笑)。 0443デフォルトの名無しさん2013/09/27(金) 23:42:09.81 monoが 0444デフォルトの名無しさん2013/09/29(日) 16:51:16.72 fortranでのSFMTの最速実装っていまどんなのあるの? 0445デフォルトの名無しさん2013/12/25(水) 18:00:46.47 A simple demonstration of twenty Pseudo Random Number Generators www.dotup.org/uploda/www.dotup.org4761462.zip.html Have fun with it ! 0446デフォルトの名無しさん2013/12/25(水) 19:02:50.07 擬似乱数が真の乱数に近づく条件は周期を無限大にすること、 周期が長いとどういうことが起きるか? 数値の分布が極所で揺らぎ(歪む)出すってこと
for (i = 0; i < N; i++) { a[i] = i; } for (i = 0; i < N - 2; i++) { // rand from i+1 to N-1 j = (rand() % (N - 1 - i)) + i + 1;
// swap a[i] and a[j] x = a[j]; a[j] = a[i]; a[i] = x; } if (a[N - 1] == N - 1) { a[N - 1] = a[N - 2]; a[N - 2] = N - 1; } } 0541デフォルトの名無しさん2019/01/03(木) 13:41:50.45ID:r8gE2use 後半
int data() { int i, j = 0, k = 0; unsigned int a[N]; unsigned int z[N]; unsigned char w[N];
for (i = 0; i < N; i++) a[i] = rand()%256; for (i = 0; i < N; i++) z[i] = 0;
k = 0;
while (k< 4000) { for (i = 0; i < N; i++) z[i] ^= a[x2[i]]; for (i = 0; i < N; i++) a[i] ^= z[i]; for (i = 0; i < N; i++) w[i] = x1[x2[x3[i]]]; *x2 = *w; k++; for(i=0;i<N;i++) printf("%u,",a[i]); } printf("\n");