X



疑似乱数2
■ このスレッドは過去ログ倉庫に格納されています
0003デフォルトの名無しさん
垢版 |
2007/10/17(水) 23:16:58
俺用メモ

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)) );
}
0005デフォルトの名無しさん
垢版 |
2007/10/17(水) 23:38:04
この手の乱数マジックナンバーでよくでてくる
123456789
なにふざけてるのかと思ってたら、
0.1234567891011121314… って超越数なんだな。
つまり123456789は、その超越数を10億倍して9桁の精度で切り落とした、
そこそこ質のよい数なのであった。
目からウロコ
0007デフォルトの名無しさん
垢版 |
2007/10/18(木) 01:51:23
SFMTはCPUの機能に最適化させてるメルセンヌツイスタですよね?
boostはテンプレートライブラリだからそれはいつまでたっても組み込まれないと自分は思います…。

00097
垢版 |
2007/10/18(木) 10:16:21
C++のテンプレートライブラリとして実装するものなのかなと思っただけです。
0010デフォルトの名無しさん
垢版 |
2007/10/18(木) 12:38:11
独自の乱数発生器を組み込めるのがboost::randomのよいところ。
手直しは必要だが。

っていうか、boostがテンプレートライブラリだなんて誰が言ってるの?
STLの事じゃなくて?
00117=9
垢版 |
2007/10/18(木) 14:19:16
実際違いました…すみません。
boostの一部がSTLに移植されるとか書いてあったの見てたから勘違いかな…。
regexとかはテンプレートライブラリではなかったです。

あと、SFMTの情報斜め読みしてたから勘違いしてしまいました。申し訳ありません。
0012デフォルトの名無しさん
垢版 |
2007/10/18(木) 19:08:52
RandomはTR1に入った、つまり標準ライブラリ入り内定ではある。

Regexは、テンプレートライブラリと呼ぶかどうかはともかく、
basic_regexなどテンプレートはよく使っている。
0014デフォルトの名無しさん
垢版 |
2007/10/19(金) 09:58:49
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
0020デフォルトの名無しさん
垢版 |
2007/10/25(木) 23:12:25
初心者ですみません。

メルセンヌ・ツイスタって、COBOLに移植されてないでしょうか?
MTのページは見たのですがCOBOLはなかったorz
0021デフォルトの名無しさん
垢版 |
2007/10/25(木) 23:15:18
COBOLで頑張ってもいいとはおもうけど(どっかに実装があるかもしれないけど)、
処理系の、Cの関数を呼び出す機能の利用を検討するのもありと思う
0022デフォルトの名無しさん
垢版 |
2007/10/25(木) 23:27:05
>>21
ああ、おっしゃる通りですね。Cならすでにソースあるんだし。
その方向で検討します。ありがとうございました。
0026デフォルトの名無しさん
垢版 |
2007/10/28(日) 09:43:23
昔COBOLでなんちゃって正規分布乱数を作ったな

時計の1000分の一秒の値を種にして、中心極限定理を使ったはずだ
COBOLのシステムで何をするかしらんが、この程度で十分じゃねぇの?
0029デフォルトの名無しさん
垢版 |
2007/10/29(月) 00:13:57
XorShiftのk=128では無いバージョン(32,64,96,160,192)について
誰か擬似コードor参考になるURL希望。

ググったが出て来なかった(多分やり方が悪いorz)
0031デフォルトの名無しさん
垢版 |
2007/11/02(金) 15:50:53
ド素人なので突っ込みどころがあったら御教授ください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列の長さ定義

0032デフォルトの名無しさん
垢版 |
2007/11/02(金) 15:52:35
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/
0033デフォルトの名無しさん
垢版 |
2007/11/03(土) 03:37:01
>>31
rand()は乱数としての性質があまりよろしくないという
当たり前のことを文句言われてもどうかと。
0034デフォルトの名無しさん
垢版 |
2007/11/03(土) 12:45:15
>>32

> rand()%0xffff

一般論として、
剰余を取っても良質な疑似乱数列となっていることが保証されている
乱数生成系でない場合は、剰余ではなく商を取って一定の範囲に
切り詰めるべき。

歴史的に、システムのデフォルトの乱数生成系は品質の悪いものが
多いので、良い疑似乱数が必要なら、マニュアル等で良質な
乱数生成系を使っていることが確認できなければ、デフォルトの
生成系は使うべきでない。
0035デフォルトの名無しさん
垢版 |
2007/11/03(土) 17:26:32
そんなのどうでもいいじゃん
だからまあ普通はラッパーかけて開発中はrand使って
あとで精度ほしくなったら差し替えるように作るわけだが
003631
垢版 |
2007/11/03(土) 23:00:03
>>33-35
早速の返答ありがとうございます。
色々とマヌケな勘違いをしていましたorz

rand()は「暗号用乱数に相応しくない乱数」の一例として示すために用いました。
剰余をとったのは、良質なRNGならば下位bitの乱数性もまた良質だろう
ということを逆説的に示すためです。

NISTに同梱されている線形合同法のRNGはテストをパスし、
逆に上記のプログラムで生成した乱数列は全く話にならなかったので、
バイナリへの変換の仕方がマズかったのかと思っていました。

NISTは線形合同法くらいなら通ってしまうと聞いたので
てっきりrand()でもイケるものだと…orz
0037デフォルトの名無しさん
垢版 |
2007/11/04(日) 05:32:17
>>36
実行はできてるんだね。
オレの環境だと>>31-32のコードは動かないんだけど。
# 原因はスタックに置くには配列サイズがでかすぎることみたいだけど。

乱数の質に絡みそうな部分というと型の選択がまずいんじゃね?
charじゃなくてunsigned charの配列にしたらどう?
それと剰余が違うんじゃね?
rand()%0xffff → rand()&0xffff でしょ。
あとループの回数も一回少ないと思う。
0039デフォルトの名無しさん
垢版 |
2007/11/10(土) 21:14:12
RAND_MAXの値は実装にもよるかと。

そんなことより、rand()%0xffff → rand()&0xffff  ←こいつに誰か突っ込まんのか。
0042デフォルトの名無しさん
垢版 |
2007/11/11(日) 19:11:45
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;}
こんな具合か
004342
垢版 |
2007/11/11(日) 19:16:33
コピペ丸張りで色々とおかしくなってることに気付く。
後悔はしていない。
0046デフォルトの名無しさん
垢版 |
2007/11/13(火) 04:38:48
>>45
srand_xor(int hoge)
{
extern static int x;
x=hoge;
}
これでいいんとちゃう?ん?staticはexternできなかったっけ?
0049デフォルトの名無しさん
垢版 |
2007/11/16(金) 23:27:42
あるシードを使うと、得られる乱数を繋げたバイナリが
偶然たまたま 迷走Mind.mp3 として読めるような
乱数ジェネレータを作ったら どうだろうか。
0053デフォルトの名無しさん
垢版 |
2007/11/17(土) 05:19:51
>>42 には間違いがあるので注意
0058デフォルトの名無しさん
垢版 |
2008/01/07(月) 12:16:11
団子あげ
0059デフォルトの名無しさん
垢版 |
2008/01/13(日) 16:23:59
MTの別実装を作ってみました。
ttp://mt-lite.sourceforge.net/index.html.ja

基本のアルゴリズムはいじらず実装だけを作ったもので、
メモリ節約・リアルタイム性・スレッドセーフなどに一通り配慮したつもりです。

mt19937ar・SFMT・WELL・Xorshiftなどとの比較評価はこのあたりに:
ttp://mt-lite.sourceforge.net/doc/ja/evaluation.summary.html
0065デフォルトの名無しさん
垢版 |
2008/01/14(月) 21:52:52
/* 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);}
0067デフォルトの名無しさん
垢版 |
2008/01/14(月) 23:52:54
上のほうでrand()をダイハードに食わせるとかいってた人がいたのでオチを教えておきます。
p=1.0頻発します。テストの種類によっては部分がすべてp=1.0 あわせてp=1.0みたいな。

xor128()って、例の論文に載ってるコードを組み込む場合、ライセンスはPD扱いですか?
0069デフォルトの名無しさん
垢版 |
2008/01/15(火) 16:03:59
>>62
xor128内部で使われてる変数x,y,z,wの中のxに、デフォルトの数値(123456789)の変わりに
与えられたseed値を代入するようにしてみた。
一応ちゃんと動作してるっぽいが統計的に良いのか悪いのかはよく分からん
0073デフォルトの名無しさん
垢版 |
2008/01/15(火) 20:24:10
/* >>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 ); }
0076デフォルトの名無しさん
垢版 |
2008/01/26(土) 18:55:32
論文の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;
}
008478
垢版 |
2008/02/02(土) 06:55:22
>>61のソースの所在教えてくれ
パクる
0088デフォルトの名無しさん
垢版 |
2008/02/03(日) 16:46:36
じゃあ上げとこ
0090デフォルトの名無しさん
垢版 |
2008/03/23(日) 01:46:24
あげ
0091デフォルトの名無しさん
垢版 |
2008/03/27(木) 23:56:06
XORSHIFTって、その出力の剰余を取った場合も
良質なランダム性があるって言われているのでしょうか?
0092デフォルトの名無しさん
垢版 |
2008/03/28(金) 00:05:34
XORSHIFTは良質ではないと思います
0094デフォルトの名無しさん
垢版 |
2008/03/28(金) 00:11:48
MTが一番良質と思います XORは速度は速いです 用途によっては十分です
0095デフォルトの名無しさん
垢版 |
2008/03/28(金) 00:20:58
>>91です。
XORSHIFTで剰余を取った時の結果を載せてる
WEBページを見た気がするのですが、結果が
今一だったような記憶が・・・

自分でも試してみようと思っているのですが、
理論的には説明出来そうにないし。
009795
垢版 |
2008/03/28(金) 23:26:21
>>96
個人のブログですが、確かここだったと思います。
ttp://d.hatena.ne.jp/Isoparametric/20070830/1188462129

今、改めて読んでみると、よく意味分からん・・・
0101デフォルトの名無しさん
垢版 |
2008/04/20(日) 18:00:50
単純に何の補正も無い相手に対して「捕まえられる」確率はどのくらいか。
そしてはぐれメタルが逃げない確率はどのくらいか。
その両方のデータをくれ。
0105ヽ・´∀`・,,)っ━━━━━━┓
垢版 |
2008/04/21(月) 13:20:43
PS2のドラクエ5では壁の衝突回数をカウントして乱数列の初期化してるようだ。
オラクルベリーの教会から一度も壁に衝突せずにカジノのスロットに直行すると
全く同じパターンが出てくるとか。

おそらくはぐれメタル捕獲にも何らかのパターンがあるかと
0108デフォルトの名無しさん
垢版 |
2008/05/01(木) 23:36:04
英語版MTを読んでいたらこんなのを見つけた。
ttp://en.wikipedia.org/wiki/Multiply-with-carry
で、cで実装してみた。
あんまり使えないと思うけど。

/* 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;
}
0110デフォルトの名無しさん
垢版 |
2008/05/18(日) 22:07:45
DebianのOpenSSLライブラリに予測可能な乱数の生成を行う脆弱性 - ITmedia
ttp://www.itmedia.co.jp/enterprise/articles/0805/15/news023.html

OpenSSLの脆弱性突くブルートフォース攻撃発生、簡単に暗号解読の恐れ - ITmedia
ttp://www.itmedia.co.jp/news/articles/0805/16/news019.html

Debian JPプロジェクトのアナウンス
ttp://www.debian.or.jp/blog/openssl_package_and_its_vulnerability.html
0112デフォルトの名無しさん
垢版 |
2008/08/06(水) 01:14:02
保守
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
0116115
垢版 |
2008/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()を使ったら無意味ですよね。
0119115
垢版 |
2008/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系列の方がましだと思うんだけど。
ググれば長周期の多項式も見つかるし。
0124119
垢版 |
2008/08/27(水) 03:32:41
種 s は Long なので32bit種類あるが、負の場合は試してないので実質31bit種類。
0125デフォルトの名無しさん
垢版 |
2008/08/27(水) 10:43:09
VBAのRandomizeが16bit種類
それを使って初期化後rnd()で取得できる乱数も16bit種類
XorShiftの種にそれらを使うのなら結局系列は16bit種類

本当の最初の最初に32bitの乱数をセットするときにどうすればいいのか。
32bitのランダムな位置からXorShiftを開始するのに、そのうちの16bit分しか設定できない。
0127119
垢版 |
2008/08/27(水) 14:14:51
>>125

確かにそうだ。困ったもんだ。
0129デフォルトの名無しさん
垢版 |
2008/08/29(金) 12:44:39
>>128
とりあえず
Private Declare Function GetTickCount Lib "kernel32" () As Long
後に
  GetTickCountを使って取得するようにしたよ。
0136デフォルトの名無しさん
垢版 |
2008/09/17(水) 12:00:52
予想すると
あるシードでのn番めの乱数を出したあとに、n-1番目の乱数を
定数時でだせないか?
ってことでは
0140デフォルトの名無しさん
垢版 |
2008/09/17(水) 19:03:50
XorShift ならちょっと考えればわかる。
線形合同法なら 2^{31}-1 だけ進めた x=Ax+C の A と C を求めれば可能。
メルセンヌツイスタやWELLなら
http://www.iro.umontreal.ca/~lecuyer/myftp/papers/jumpf2.pdf
の方法で周期よりも一つ少ないところへジャンプすれば不可能ではないはず。
0141デフォルトの名無しさん
垢版 |
2008/09/17(水) 21:13:31
これって読み捨てるのと比べてどのぐらい高速?
MTの先頭の何百万個か読み捨てる処理に使えそう?
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
とつげき東北とかいう人の乱数生成法を見て思いついたけど
メモリを確保して、読み書きする速度を計測すれば真の乱数できそう。
もともとはハードディスクの読み書きだが。これだと生成に時間食う。
0149デフォルトの名無しさん
垢版 |
2008/10/22(水) 21:24:52
でもメモリが余ってるときに均一に分布したとしても一杯になったら悪くなるかも試練ね
0151デフォルトの名無しさん
垢版 |
2008/10/22(水) 21:39:34
Unix の /dev/random は、デバイスドライバからそういう真の乱数を
生成するようなタイミングの情報をもらってデータを生成しているのだが...
0152デフォルトの名無しさん
垢版 |
2008/10/22(水) 21:41:38
実行時まで偏ってるかどうかすら分からんから実用的には疑問だけどな。
違うハードの組み合わせで似たようなシードが繰り返し出てしまう可能性も否定出来ん。
特性が誰にも分からんから乱数としてもいいだろうって発想は学問的ではないな。
0153デフォルトの名無しさん
垢版 |
2008/10/22(水) 21:45:17
元手にするだけで、そのまま使うはず無いだろ。
たとえば、メモリ確保と読み書きした間隔が
1ナノ秒から100ナノ秒に分布しても偏りはでる。
そこは適切に処理して良い具合にする
0155デフォルトの名無しさん
垢版 |
2008/11/03(月) 16:36:49
srand(0)とsrand(1)はその処理系でも同じ系列を生成するのですか?
0157デフォルトの名無しさん
垢版 |
2008/11/03(月) 17:45:50
なんだろね?

ところでシードに関して系列という単語がよく出るけど違和感が…
乱数アルゴリズムの多くはシードは開始位置を決めるだけで
同じ乱数列を参照してるんだよね。
イメージ的には馬鹿でかい時計のようなものがあって、
秒針よりももっともっと小さい針が数字を拾ってる感じ。
系列という言葉だとそれぞれが全く違う乱数列のように聞こえる。
まあ現実的には2^128くらいあれば被ることはないと思うけどさ。
なんか気になる。
0158155
垢版 |
2008/11/03(月) 17:52:33
まちがえました。
「その処理系でも」→「他の処理系でも」
でした。
0159デフォルトの名無しさん
垢版 |
2008/11/03(月) 17:59:04
srandはアルゴリズムからしてライブラリの実装次第だから
処理系以前に互換性はないと思え。
そもそもrand自体0からRAND_MAXまでの整数を出力するとかそういう定義しかないはず。
確かMTはその辺しっかりしていて、どこでも同じ結果が得られたはず。
0160デフォルトの名無しさん
垢版 |
2008/11/03(月) 19:41:28
>>157
rand() を実装するために使用する手法がいろいろあり、たとえば線形合同法・M系列・メルセンヌツイスタなどと呼ばれるものでしょうね。
手法とパラメータさえ同一であれば、当然同じ乱数列が生成されますが、rand()/srand() がどのように実装されているか、明確に
定義されているわけではないので、なんともいいようがないですね。
0161デフォルトの名無しさん
垢版 |
2008/11/05(水) 19:25:05
>>148
>MTのような、周期の長い良質な擬似乱数の種としてこれを使えば、暗号ツールなどに実用的に応用できる。

MTのような暗号的に安全ではない擬似乱数の種に、暗号的に安全な乱数
を使っても出力は暗号的に安全ではないよな?
この記述はおかしいよな?
0162デフォルトの名無しさん
垢版 |
2008/11/05(水) 19:38:22
いや。

暗号的に安全ではない乱数生成系を、暗号関係の目的で使用するには、
出力ストリームに一方向ハッシュ関数を噛ませる方法がある。

その時に、シードは予測不可能なものである必要がある。
0163デフォルトの名無しさん
垢版 |
2008/11/27(木) 22:25:54
NIST test 2.0bってどうなの?

なんかDFTで必ず落とされるんだけど。
とりあえずMT19937, G using SHA-1, Micali-Schnorr試したけど駄目だった。
0168デフォルトの名無しさん
垢版 |
2009/01/05(月) 13:49:11
概要をコピペ
> テンポラリファイルフォルダにファイルを作成・削除し、その処理にかかった時間
> を高分解能パフォーマンスカウンタで計測して、処理時間を得る。
> 処理時間のビット列のうち、偏らないビットを乱数ビットとして利用する。
> ハードディスクのシーク時間や物理的な書き込み速度は、キャッシュや温度や湿度や
> Windowsの処理順などによってばらつきがあるので、良質なランダムビットがとれる。
> 測定されるビットの変化を最初にテストしておくことで(100回のビット発生で、
> 充分に変化が見られたビットだけを乱数に使用する)、処理速度の違いや、パフォーマンスカウンタの質の悪さ(例えば最下位ビットが必ず偶数や奇数になる可能性)も吸収できる。
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使えということになっている。
0174デフォルトの名無しさん
垢版 |
2009/03/09(月) 20:38:50
何が問題なんだろ。
松本さんの実装は、内部状態が1周した時に一斉に計算するようになってるので、
負荷が一定しないよなぁとは思うんだが、そういうとこじゃなくて、原理的に問題が
ある、っつってんだよね。
遅いというのは、はあそうですか、というだけなんだけど、blogのほう見ると、
XOR だけで構成されている、ってことをdisってるように見えるんだが...
0177デフォルトの名無しさん
垢版 |
2009/03/10(火) 00:55:31
どんなアルゴリズムであっても一周期において均等分布を達成するとなると
全てのビットパターンを発生させるという点で結局M系列と同じ事になるんだよな。
するとマクロではみんな十分にランダムということになるから、
あとはミクロでのランダムさとその実装方法からくる計算量が問題なわけだな。
そのあたりに何かあるんじゃなかろか。
0178デフォルトの名無しさん
垢版 |
2009/03/10(火) 11:49:47
なんかその論文で提案してるテストでは、暗号学的な強度のあるジェネレータ以外は
のきなみパーフェクトでない結果を出してるみたいだ。
MTの成績が際立って悪いとかそういう結果ではないけど、ffmpegの作者的には
気になる結果なのかな?
0181デフォルトの名無しさん
垢版 |
2009/06/20(土) 20:18:13
http://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]

*5 http://groups.google.com/group/comp.lang.c/browse_thread/thread/a9915080a4424068/
*6 http://groups.google.com/group/sci.crypt/browse_thread/thread/305c507efbe85be4
0184デフォルトの名無しさん
垢版 |
2009/08/11(火) 03:30:02
あげ
0186デフォルトの名無しさん
垢版 |
2009/08/14(金) 01:57:19
お初ですが質問させてください。

現在sfmtについて作成者のHPにあるプログラムを見て勉強しています。

そこで64bitでシフトしてる部分があって、unsigned long long等が対応していないコンパイラでやる場合(32bitまでしかない)、何かいい方法はありますか?
自力で32bitでシフトしてもいいのですが…

初心者なので意味不明な説明かもしれませんが、参考になる方法やHP等ありましたら教えてください。
0190デフォルトの名無しさん
垢版 |
2009/08/14(金) 13:23:06
186です。

さっそくの返信ありがとうございます。

一応必要な部分だけアセンブラで書くことも可能だったと思いました。ただ現在携帯からの書き込みでキツいので、あとでまた書きます。
0192デフォルトの名無しさん
垢版 |
2009/08/15(土) 20:24:26
どなたかご教示願います。
lehmerの線型合同法で作成される乱数値は、
初期値が同じでも計算機環境の違いにより変わることはありますか?
0193デフォルトの名無しさん
垢版 |
2009/08/16(日) 02:20:18
うん
0199デフォルトの名無しさん
垢版 |
2009/08/17(月) 13:04:38
>>194
有効桁数をちゃんと制御して、その動作が保証されている言語を使うなら、
バグでない限り有効桁数の範囲で変わることはない。

ただ同じ数式の同一の変数に別の値を与えたのなら変わってもおかしくないよ。
つかそれ以前に疑似乱数に関係あるのかw
0200デフォルトの名無しさん
垢版 |
2009/09/03(木) 21:52:50
高次元均等分布性ってどういうこと?
p[i]=(x[Ni+0],x[Ni+1],…,x[Ni+N-1])
として作ったN次元乱数のN次元空間上散布図が
N次元空間内に平面作ったり偏ったりせずにぼんやり分布することと考えていいのかな?
0201デフォルトの名無しさん
垢版 |
2009/09/04(金) 07:05:22
誤解を恐れずに大雑把かつ簡単に言うと、
nビットの状態空間があるとして、
一周期の間に00...00から11...11までnビット(n桁)の数字が
過不足なく1回ずつ出現すること。
それが満たされると周期全体で直前のn-1ビットの状態に関わらず
次の1ビットの出現確立が必ず50:50になる。
つまりn-1次元で0と1が均等に分布したことになる。
状態空間を越えた次元では分布については全く保証出来ない。
だからMT含めて最近の擬似乱数はみんな状態空間をかなり大きめにとってる。

ただしこれはあくまで一周期のことであって、
一周期の一部を切り出した場合(通常の使用状況)では全然話が別ね。
マクロとミクロの違いというか両方同時に成り立たせるのは難しい。
よく0過多状態からの回復の速さが注目されるけど、
状態空間が大きいのに三項式とかだと(MTのことね)
0の多い区間はその前後でも0が多くなる。
逆に1の多い区間はその前後で1が多くなってトータルで均等になるわけさ。
0202デフォルトの名無しさん
垢版 |
2009/10/04(日) 07:32:06
一月あげ
0208デフォルトの名無しさん
垢版 |
2009/10/05(月) 18:55:46
blumblum.c とfreelip いうファイルを見つけ
http://www.mindspring.com/~pate/crypto/chap05/blumblum.c
http://math.arizona.edu/~aprl/math/comp/bigint/
blumblum.c をgcc (GCC) 4.2.4 でコンパイルするのですが
zcopy とか、zfree とか、zなんとかという命令がコンパイルできなくて詰まっています。
何なんだこのz何とかというコマンドは?cの命令セットにはないぞ、posix かなんかの命令セットなのか?
0209デフォルトの名無しさん
垢版 |
2009/10/05(月) 19:01:35
>>204>>208です皆さんサンクスです。
>>207
その通りです、java からの移植はBigInteger を見て、ライブラリから作る羽目になりそうだったので
速攻あきらめました。boost にBlumBlumShubがあればいいのにな・・・・
0210デフォルトの名無しさん
垢版 |
2009/10/06(火) 00:46:53
>208
C/C++ ではコマンドとか命令とか命令セットとは言わないだろう、普通。
命令セットって言われたら CPU の instruction set を思い浮かべるわ。

で、freelip ってのの中に z* 入ってるじゃん。
C/C++ の分割コンパイルに詰まってるんだろうけど、とりあえず
gcc -o blumblum blumblum.c lip.c
とかで実行ファイルできない?

あと、boost vault には bigint が有ったような。使いものになるかしらんけど。
0215デフォルトの名無しさん
垢版 |
2009/11/14(土) 09:37:55
xorshiftをunsigned longではなく32bit intの範囲内でやる方法はありませんか?
0216デフォルトの名無しさん
垢版 |
2009/11/14(土) 16:45:06
complementary multiply-with-carry ってのが
周期長くて計算軽いってのは分かったけど
高次元での均等性はどうなの?
MTだと623個の組で使っても大丈夫ということだけど
0217デフォルトの名無しさん
垢版 |
2009/11/14(土) 19:33:47
RC4が最強だろ
0218デフォルトの名無しさん
垢版 |
2009/11/15(日) 00:29:33
>>215
符号無しの整数型が存在しない言語で実装しようとしているのか?
例えば、Javaとかだと符号付き整数型でも気にせずビット演算して大丈夫のはずなんだけど。

もう1つ、そのunsigned longはおそらく32ビットだと思う。コードを注意してみて。
違ったとしてもググれば32ビット符号無し整数(unsigned intだかunsigned longだか)での実装はすぐ見つかると思う。
0222デフォルトの名無しさん
垢版 |
2010/01/08(金) 13:19:31
シェーダ/GPGPU向けでよい疑似乱数ってどんなのがあるでしょうか。
数列系の疑似乱数を直に使うことが出来ないのでいろいろ考えています。
0226デフォルトの名無しさん
垢版 |
2010/01/08(金) 15:01:10
アナログテレビの砂嵐状態のように、全画素を毎フレームノイズで埋め尽したいと考えています。
その際、2次元画面*時間の3次元で相関などがなく一様分布するノイズにしたいのです。
画素ごとに並列に計算できれば高速に計算できることは分かっているのですが、
数列を使う以上は基本的に一つずつ取り出すしかなく並列化できません。
そのため、並列計算で生成できる疑似乱数生成法がないかと探しているところです。

一応全画素に32バイト割り当てればそれぞれXorShiftの系列が張り付けられるかなとは考えましたが、
やはりちょっとワーキングセットが大きくなるのと、
XorShiftの系列間相関の有無がよくわからず、躊躇しています。

自分で実装しなければならないなら、各画素の計算では、画素の座標(各座標に固有だが相関たっぷり)と、
フレームごとに全部画素一律に参照できるベクトルを与えることができるので、
それをうまく使って乱数列の系列の途中の値をうまく与えられないかなあ、などと考えています。
0228デフォルトの名無しさん
垢版 |
2010/01/08(金) 15:33:08
xyz全部に相関なしか…そいつぁ難しいぜ
とりあえず画素毎に独立した個別の乱数を充てるのはダメだな
少なくとも画素以上の状態空間を持った乱数を用意しないと相関なしには出来ないんだぜ
適当に作っても任意の画素間で相関がないことを保証できないだろ?
そもそも同じ生成式を使えば初期値が違うだけで結局同じ乱数列しか得られないからな

とまあ大げさに書いたけど、本気で3次元完全無相関を目指してるわけじゃないよね?
落としどころとしてはMTとか周期の長い乱数を使って
一定フレーム毎に各画素の状態を更新してしまえばいいと思うよ。
各画素はM系列とかXorShift?(いまいち信用できない)を使えばよろし。
0229デフォルトの名無しさん
垢版 |
2010/01/08(金) 20:32:23
遅れまして申し訳ありません。

>>228
勉強になります。
一瞬、隣の画素の状態を見ながらメルセンヌツイスタのように「捻れ」ないかと思いましたが、
結局そこでデータコヒーレンシーの問題で並列化できなそうなのでそれも無理そうですね

結構本気で3次元無相関を目指しているというか無相関であることが優先される用途なので、
現在は時間を仕切って有限の大きさにしてプールして切り出し、というのが現実的な解となっています。
ただ長時間やるにはメモリがいくらあっても不足するような感じなので、
なんとか生成できないかなあと思う次第です。
副産物として、落としどころとしてそれっぽいものを作ることは吝かでもないですが。
0230デフォルトの名無しさん
垢版 |
2010/01/08(金) 21:37:19
>>229
当然ながら精度と速度は両立しないんで、
どこまで必要なのか見極めて妥協することになるけど、
仮に1画素あたり32bitとして640*480なら、
最低でも1228800バイト以上の状態空間が必要だね。
これで1フレーム分だから残り何フレームまで必要なのか考えてみればいいよ。

>一瞬、隣の画素の状態を見ながらメルセンヌツイスタのように「捻れ」ないかと思いましたが、
MTの「捻り」はGFSRの短かった周期を理論値まで伸ばしてるだけ。
無闇に隣を参照したらダメだよ。
0231デフォルトの名無しさん
垢版 |
2010/01/08(金) 23:07:46
>>230
ありがとうございます。
まずはM系列からということでググったり本棚をあさったりしていたのですが、
疑似乱数を作るということは、どういう遍歴をたどる数列を設計するかという話だ、ということが改めて身にしみました。
また、正しく「捻る」にはビットの遍歴が最長となるよう正しくビット間の周回コースを繋がなければならない、という理解でいいのでしょうか。

> 落としどころとしてはMTとか周期の長い乱数を使って
> 一定フレーム毎に各画素の状態を更新してしまえばいいと思うよ。
という話は、最初見たとき手抜き実装かなと思ってしまったりしたのですが、
冷静に考えるとCPU側とGPU側の状態は両方とも完全に決定可能なのだから、
周期や分布もちゃんと計算できるのですね。
この方法が自分の目的にとっては王道のような気がしてきました。

まったく不勉強で疑似乱数の世界の入場門がどこにあるかがやっとわかった状態ですが、
道筋がなんとなく見えてきたので、次に質問する前に、もっと自分で勉強してみたいと思います。
素人の思いつきに懇切丁寧にご回答いただきありがとうございました。
0235デフォルトの名無しさん
垢版 |
2010/01/09(土) 23:20:47
>アナログテレビの砂嵐状態のように、全画素を毎フレームノイズで埋め尽したいと考えています。

あれ、ほんとに相関なしなん?>詳しい人
なんか、いいセルオートマトンとかありそうじゃない?
0236デフォルトの名無しさん
垢版 |
2010/01/10(日) 00:55:27
砂嵐状態っていっても度合いがあるからね。
元の信号が強く混ざってれば文字通り目に見えて分かるし。
砂嵐(スノーノイズ)の原因は熱雑音らしいから
S/Nが十分に悪ければ(笑)ほぼ相関なしといえると思う。

熱雑音はランダムか?という問題は話が別ね。
そっちは量子論の問題だから。
何か法則があるかも知れないしないかも知れないけど
とりあえず理論的に確認できる方法がないので(観測問題)
そこのところは考えないでおこうってのが今の主流。
どちらであっても今のところ結果は統計的な予測と一致している。
ので今のところ統計的に熱雑音はランダムと言えるっぽい。

そもそもランダム・不規則ってなんだ?ってのも哲学っぽくて難しい問題だ。
熱雑音も本当は原子の状態(擬似乱数でいう状態空間)を完全に知ることが出来れば
その後の振る舞いを予測することが出来るはずなんだけど(決定論)
前の状態と次の状態を同時に知ることが出来ない(観測問題)。
観測者の有無に関係なく次の状態は決まっていると考えたのはアインシュタインで
(神はサイコロを振らない)この説は今は少数派。
果たして観測者が次の状態に影響を与えた結果は如何に?

ところで仮に完全に熱雑音の振る舞いを表現することが出来たとして
それをもし理論的に解析できたとしたらその結果はランダムだろうか?
周期も分布も分かってる既存の擬似乱数の方が良かったらどうだろう?
今までに我々がランダムと呼んでいたものの正体は…?
0237デフォルトの名無しさん
垢版 |
2010/01/10(日) 03:21:02
仕組みが分かったところで、解を出すためには初期条件が必要
シードを与えて一意な結果を出すのは一般的な乱数と同じものだろ
0241デフォルトの名無しさん
垢版 |
2010/01/10(日) 19:07:32
DOOM をソフトウェアラスタライズしていた頃と比べれば、リアルタイム程度なら CPU で mt やって充分間に合いそうな気がする。
こういう大量生成が対象なら、前に Cell スレで盛り上がってたコンテストの最適化がフィットすると思う。
そんで別の種でマルチスレッドでクアッドコアで、って感じでどうだろう。
0245デフォルトの名無しさん
垢版 |
2010/01/11(月) 20:19:14
二次写像などのカオスの数値の下ビットを使うというのはどうだろう

でも実際に相関がないことを証明する必要があると面倒ですね。
plot(rand mod 640,rand mod 400,rand mod 16)
とかでとびとび直線が出てびっくりですよ
0246デフォルトの名無しさん
垢版 |
2010/01/11(月) 20:48:42
>>245
数理的な意味でのカオスってのは、テント写像に代表されるように
小数点以下を無限に汲みだす漸化式になっているから予測が難しいのであって、
種が有限桁数であっては成立しない。

むしろ、いかなる相関性のある入力に対しても、
周期は短くていいから高速に前ビットかき回して相関のない出力を出す関数があればいい気がする。
0247デフォルトの名無しさん
垢版 |
2010/01/11(月) 20:48:48
こんなことを言い出すやつがいるとは…
それは線形合(ry
このスレは分かってる人とそうでない人のレベル差が妙に大きいな
0248デフォルトの名無しさん
垢版 |
2010/01/11(月) 20:57:18
>むしろ、いかなる相関性のある入力に対しても、
>周期は短くていいから高速に前ビットかき回して相関のない出力を出す関数があればいい気がする。
いいわけない、というかそれはただのハッシュ
等確率性・分布・周期を保証できないし
入力がずっと同じだったらどうにもならん
0249デフォルトの名無しさん
垢版 |
2010/01/11(月) 21:02:21
>>248
アンカが抜けてた

>228の
> 落としどころとしてはMTとか周期の長い乱数を使って
> 一定フレーム毎に各画素の状態を更新してしまえばいいと思うよ。
に対して、それなら各画素で回す周期は短くていいんじゃないかなと。
等確率性と分布は証明or検証する必要性があるとして。
0250デフォルトの名無しさん
垢版 |
2010/01/11(月) 21:36:24
>>246
頭悪そうな意見だな。周期が短い時点で相関性アリまくりだろうが。
↓こういう馬鹿(道化師)がいたことを思い出す。
【危険】とんでもプログラム告発スレッド【悪質】
http://pc11.2ch.net/test/read.cgi/tech/1191860116/
1 名前:デフォルトの名無しさん[] 投稿日:2007/10/09(火) 01:15:16
劣悪なプログラムやアルゴリズムを、恰も優れたものだと言い張り、
他人を騙しているサイトを告発、検証、監視することを目的としたスレッドです。
単純に技量不足だったり、稚拙であるもの、下らないものは対象としません。
第一弾として、
道化師氏のサイト(http://www.trickpalace.net/)の
疑似乱数アルゴリズム「無相関性擬似乱数アルゴリズム-prime spiral-」
http://www.trickpalace.net/column/random.htm
を紹介します。このアルゴリズムおよび作者の言動の問題点は以下のとおり。
・MT(Mersenne Twister)がダメだと主張しながら、具体的な問題点は指摘できていない。
・MTより劣悪な乱数を生成しながら、MTより優れていると主張する。
・周期がたったの2^32のしかない(線形合同法と同レベル)
・無駄にテーブル参照するため遅い(線形合同法より劣悪)
・優れていると主張しながら、言葉の定義と評価基準を示すことはしない。
・indexと最低限の出力系列(各素数の和)が得られると、初期ベクトルが逆算ができてしまう。
・最低限の出力系列で、全パターンに出現する値の分布が確定する。
indexが確定すれば出現順まで確定するほど相関性が非常に高く劣悪。
・出ない値が確定するという点で乱数とはもはや呼べない。
・作者は暗号用途にも使えるつもりでいる。MTより「良い」乱数だと宣伝しているが、
実際は周期、分布などの点で低品質。信じて使うとろくなことにならない。

アルゴリズムの問題点や作者の人間性が明らかになる過程はこちらのスレで読めます。
擬似乱数
http://pc11.2ch.net/test/read.cgi/tech/1146071975/
0254デフォルトの名無しさん
垢版 |
2010/01/12(火) 11:59:26
>>226
ホワイトノイズ(一様分布)じゃなくてブルーノイズでも良いなら方法はある。
ブルーノイズはホワイトノイズの低周波成分を除いたもの。

ホワイトノイズではモアレのような模様が見えるがブルーノイズでは模様は見えない。
0257241
垢版 |
2010/01/13(水) 05:15:25
試してみたが、VC++2008EE の /O2 でコンパイルした MEXP=216091 の sfmt の gen_rand32() で
1920x1200 を 30 枚埋めるのに、2003年の CPU P4 2.6C で 600ms 弱くらい。
今なら余裕じゃない?
0258デフォルトの名無しさん
垢版 |
2010/09/14(火) 17:15:16
DIEHARDテストはp-valueが一つでも p < .025 or p> .975が
あると失格なのでしょうか?

>>148のは13個あるのに合格って書いてありますけど。
359行 - 0.97978
391行 - 0.01013
533行 - 0.9948
541行 - 0.9988
543行 - 0.9825
569行 - 0.0003
602行 - 0.0243
610行 - 0.9907
612行 - 0.0049
672行 - 0.985720
687行 - 0.007759
692行 - 0.987352
857行 - 0.009586
13個
0259デフォルトの名無しさん
垢版 |
2010/09/30(木) 05:03:43
擬似乱数についてまとめた本とかってあります?
0265デフォルトの名無しさん
垢版 |
2010/10/01(金) 07:52:17
乱数生成generalized reed solomon(GRS)
コンパイルしてみてください。あらさがしもOK。
0266デフォルトの名無しさん
垢版 |
2010/10/01(金) 12:22:27
>>265
$ gcc grs.c -o ggg
grs.c: In function `main':
grs.c:614: error: `__m128i' undeclared (first use in this function)
grs.c:614: error: (Each undeclared identifier is reported only once
grs.c:614: error: for each function it appears in.)
grs.c:614: error: syntax error before ')' token
grs.c:615: error: syntax error before ')' token
0267デフォルトの名無しさん
垢版 |
2010/10/01(金) 12:26:55
インデントぐちゃぐちゃだわ、場所によってコーディングスタイル違うわで気持ち悪いソースだな
0268デフォルトの名無しさん
垢版 |
2010/10/01(金) 17:22:01
C:\cygwin>gcc -O2 -ftree-vectorize -ftree-vectorizer-verbose=5 -msse2 -o hash ha
sh.c
0269デフォルトの名無しさん
垢版 |
2010/10/01(金) 17:23:29
C:\cygwin>gcc -O2 -ftree-vectorize -ftree-vectorizer-verbose=5 -msse2 -o grs grs.c
0273デフォルトの名無しさん
垢版 |
2010/10/22(金) 10:15:00
つまり、「著作権表記なしで使える実装」のある、「優秀な擬似乱数生成アルゴリズム」を所望しているのかな。
んなもん、自分で実装すれば選び放題だ。
0274デフォルトの名無しさん
垢版 |
2010/10/22(金) 23:22:08
例えばメルセンヌツイスタはBSDライセンスだけど
コードを参考にして自分で実装すればBSDライセンスに従う必要は無いってこと?
0276デフォルトの名無しさん
垢版 |
2010/10/23(土) 08:59:29
メルセンヌ・ツイスターの性能に勝るとも劣らない優れたもの??らしい。
ttp://ayusya.hp.infoseek.co.jp/AlgorithmRandom.html
0277デフォルトの名無しさん
垢版 |
2010/10/23(土) 09:51:07
XORSHIFTにちょっと似てる?

いずれにしろ、高次元での相関や周期について、なんの数理的保証もないので
(MTはどちらも数理的に保証している)比較対象になんないよ。
当人は2次元の分布の見た目で評価して同等とか言ってるけど。
0278デフォルトの名無しさん
垢版 |
2010/10/23(土) 12:52:34
ISAAC
ttp://burtleburtle.net/bob/rand/isaacafa.html

WELL
ttp://www.iro.umontreal.ca/~panneton/WELLRNG.html

KISS
ttp://www.math.niu.edu/~rusin/known-math/99/RNG

こんなとこかな。
0280デフォルトの名無しさん
垢版 |
2010/10/23(土) 20:43:04
ちょっと乱数が欲しいというときの物としてなら受け入れられるだろうに、
MTと比較してと書かれるとイタいだけだな。
0283デフォルトの名無しさん
垢版 |
2010/10/24(日) 01:27:04
周期が55898とか出てるんだけど、なんか間違ってる?
0x65AC9360ULにしたら長くなったけど…
0284デフォルトの名無しさん
垢版 |
2010/10/24(日) 02:29:14
周期が明示されていない、または、作者もわからないような擬似乱数はゴミだろ。
あと、同じ値が連続して出ないようなものは、いくら一次分布が均一に見えても乱数として使えない。
0285デフォルトの名無しさん
垢版 |
2010/10/24(日) 07:41:43
線形合同法なんか、まさしくその「同じ値が連続して出ない」乱数なんだが。
誕生日検定に通らないわけだけどね。
0287デフォルトの名無しさん
垢版 |
2010/10/24(日) 08:28:08
ていうか、周期性があるものは、連続して内部的に同じ値(状態)をとるわけがない。
単に、特定の部分(bit)を取り出しているから、その部分では同じ値に見えるというだけ。

線形合同法を使っていても、例えば32bit中14bitを用いるのであれば
同じ値の連続は起こる。
0288デフォルトの名無しさん
垢版 |
2010/10/24(日) 08:58:30
所詮は有限個の整数の集合を同じサイズの整数集合に写像する関数だから、
内部的に2度続けて同じ状態をとるとしたら、その後は永久にその値になるからな。
物理乱数でもなければ窓を使うことで、その精度での乱数性を確保しているというだけだし。

MTはM系列系統だから有限個の整数を一つずつ漏れなくたどり、
一周した場合に一様分布であることはほぼ自明だが、
相関性についてはどうだったろう?
統計的に検定はしてるけど、なにがしかの証明はされてたっけ?
0289デフォルトの名無しさん
垢版 |
2010/10/24(日) 16:41:50
検索してみたら、乱数の誕生日検定について、情報がネットには全く存在してないでやんのw
「誕生日のパラドックス」が乱数列として期待される通りに成り立つかどうかの検定ね。
確かKnuthの本には書いてあった。
0290デフォルトの名無しさん
垢版 |
2010/11/06(土) 22:40:38
別スレで聞いたのですがこちらに誘導されたので質問します。
メルセンヌツイスタを使って0〜(n-1)までの乱数を作りたいのですが、
これだとダメって言われたんですがどこを直せばいいのでしょうか。
INT value;
do {value=genrand_int31()%n;}
while(value>=0x0fffffff-value%n);
0291,,・´∀`・,,)っ-○○○
垢版 |
2010/11/06(土) 23:03:00
いろいろひどいからエスパーしていい?

要件:
1.genrand_int31()の剰余をとる
2.分布を完全に均等化するために剰余をとる前の値がNの倍数通りになるように再実行する

んで、

#define INT31_MAX 0x7FFFFFFF // ←ここ重要

int value;
do { value = genrand_int31();
} while (value >= INT31_MAX - (INT31_MAX % n));
value %= n;


MTは下位ビットをとっても安全な疑似乱数だからどっちでもいい
0294デフォルトの名無しさん
垢版 |
2010/11/07(日) 12:16:05
もう終わったのかもしれんが
>>291
value = genrand_int31();
これはマイナスの値が返って来る可能性があるから
value = genrand_int31() & 0x7FFFFFFF;
にするべきじゃなかろか
0297,,・´∀`・,,)っ-○○○
垢版 |
2010/11/07(日) 15:15:37
MTのソースってこんな感じじゃなかったか?最近読んでないけど。

int genrand_int31() { return genrand_int32() & 0x7FFFFFFF; }
0300,,・´∀`・,,)っ-○○○
垢版 |
2010/11/07(日) 16:39:17
より厳密に言えば右シフトが論理になるか算術になるかはCの規格上は未定義だったりするのね
unsignedなら論理シフトになるってのはある程度のCPUでは共通してるだけの話
0302デフォルトの名無しさん
垢版 |
2010/11/07(日) 19:45:33
逆だろ。

Cの規格では、
unsignedの右シフト
及び、
signed型であっても保持している値が正である時の右シフト
これはいずれも論理シフトになることが決まってるんじゃなかったか。
0304デフォルトの名無しさん
垢版 |
2010/11/07(日) 20:03:17
この辺かな
ttp://flash-gordon.me.uk/ansi.c.txt

   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.
0307デフォルトの名無しさん
垢版 |
2010/11/08(月) 12:14:17
算術シフトしかないCPUで、シフト演算はのんきに全部その命令を生成しちゃう
コンパイラだってあるかもしれんし、Cの仕様はそれすらimplementation-definedと
言っていそうな雰囲気がある。この場合は違ったわけだが。
0310デフォルトの名無しさん
垢版 |
2011/01/18(火) 01:52:26
NIST検査について質問です。乱数の統計的性質を調べるソフトなのですが、
このテストをすべて合格しないと乱数とは言えないのでしょうか?
特にFFT検査の場合に不合格になります。周期はないと思うのですが、なぜか
うまくいきません。それとも、これだけは絶対に通らなくてはいけないという
検査があるのでしょうか。どなたかご教示願います。
0314デフォルトの名無しさん
垢版 |
2011/01/19(水) 16:52:17
疑似乱数に詳しくない俺が言うべきじゃないのかもしれないけど
乱数と疑似乱数を分けて考えてない人が居るような気がするんだ。
乱数、たとえばサイコロとかで作った乱数なら2回以上続けて6が出ることもあるでしょ。
でも線形合同法とかの疑似乱数は、同じ数が2回続けて出ることはないし、
循環しちゃうし乱数とは別物じゃない。だから、疑似と真の区別をはっきりさせないと
話がかみ合わなくなる気がするんだ。
0317デフォルトの名無しさん
垢版 |
2011/01/19(水) 17:53:20
>>315
何処がどう分かってないのかハッキリさせないと、その発言に意味はないと思いますよ。
意味のない発言の塊が2chなわけですけど
0321314
垢版 |
2011/01/19(水) 19:16:42
>>318、320
よく分からないんですが、疑似と真乱数を分けて考える必要はないということですか?
0324314
垢版 |
2011/01/20(木) 01:23:19
>>322
そもそもこの2つは別物なのにその2つを同じ言葉で表すのが気持ち悪いと感じるんですよ。
>>310は疑似乱数のテストについて質問していて、>>311、312は真乱数を前提に
話してるみたいだし、>>313は疑似乱数を前提に発言してる。どうも疑似と真を分けてないから
話が噛合ってないように見えるんですよ
0327デフォルトの名無しさん
垢版 |
2011/01/20(木) 17:55:54
わざと答えをはぐらかしてるみたい
0328デフォルトの名無しさん
垢版 |
2011/01/20(木) 18:03:55
324は正しい
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
0333デフォルトの名無しさん
垢版 |
2011/05/18(水) 23:21:48.27
とりあえず検定の結果を示してもらわんとなんとも。

それで線形合同法の推奨されてるパラメータを越える成績ならともかく。
0335デフォルトの名無しさん
垢版 |
2011/05/19(木) 16:36:50.88
ぶっちゃけそこはn=n+(秒針)みたいなでいいと思う
あとn/2/(nの約数の合計)なら多分1〜0しかでない
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命令は統計的に均一かつ非周期的、非決定的なデータを生成することが保証されている。

オンチップ-エントロピー源の出来如何に関わるという印象を受けますが、さて、どうでしょうか?
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;
}

rand()ってスレッドごとに独立した系列の乱数列返すの?
既出だったらすいません。
環境はcygwin+gccです。
0341デフォルトの名無しさん
垢版 |
2011/06/16(木) 13:48:55.52
そもそもrandがスレッドセーフである保証がない。
スレッドセーフでない関数の読み出しにはロックをかけろ。

疑似乱数の実装がスレッドローカルならスレッドIDとタイムスタンプを組み合わせてseedに使うかな
0342デフォルトの名無しさん
垢版 |
2011/06/16(木) 21:37:26.52
>>340
rand_r()は実装されてないの?
シミュレーションとかに使うなら、当然もっとまともな乱数使うべきなんだけど
0344天使 ◆uL5esZLBSE
垢版 |
2011/07/03(日) 19:51:40.73
2011年、Ruby,Perl,PHP,Pythonって並べたときにさ
ここで、Ruby以外を選ぶ奴ってマジでなんなんだろうな


ゴミは何いってもゴミ
0347デフォルトの名無しさん
垢版 |
2011/07/18(月) 01:12:26.71
初カキコというか質問があるんですが
0349デフォルトの名無しさん
垢版 |
2011/07/18(月) 01:27:26.98
パワフルプロ野球スレでcupsを256にすれば天才選手(低確率で出る初期能力が強い選手)が出ると聞きました
乱数のことはよくわからないんですがそのcupsという項目があって
それを256に合わせればいいという認識でよろしいんでしょうか

それがあってるとして、
乱数は数値化しないとそれにあわせることはできないのでしょうか
もしくは数字だけが分かっていればなんとかなるものですか?
0352デフォルトの名無しさん
垢版 |
2011/07/18(月) 01:37:58.95
>>351
しゅません、ここしか見つからなくて…
0355デフォルトの名無しさん
垢版 |
2011/07/25(月) 19:32:37.26
普通、品質って言うわな。

シードとサンプルの長さと、どのような検定で、どういう風に結果が悪いのか、
定量的なことが書いてあれば一読に値すると思うが、これではわけわからん。
0356デフォルトの名無しさん
垢版 |
2011/07/25(月) 19:37:41.28
ゲームに使うとかいろいろな種を試したとか
乱数の事なんか何にも分かってないんだろう
悪いけどそんな個人ブログなんか読む価値ないよ
0357デフォルトの名無しさん
垢版 |
2011/07/25(月) 19:37:53.89
つーかウィキペディアのXorShiftの記事にも「精度」って言葉が使ってある。

誰だよほんとにもう。
0358デフォルトの名無しさん
垢版 |
2011/07/26(火) 12:24:34.03
http://ja.wikipedia.org/w/index.php?title=Xorshift&action=history
> 2011年7月25日 (月) 22:05 MetaNest (会話 | 投稿記録) (1,890バイト)
> (疑似乱数列の評価として「精度」なんて形容を使うのは聞いたことがない)

自分が聞いたことがないから間違っている、
という理由で編集する前に他の記事を確認してください。

http://www.google.co.jp/search?q=%E4%B9%B1%E6%95%B0+%E7%B2%BE%E5%BA%A6+site%3Aja.wikipedia.org
「精度」はどのくらいのビット数で示される範囲で乱数になっているかという意味で使われているようです。
つまり品質の一部分ですね。
0363ななし。
垢版 |
2011/07/27(水) 14:04:51.54
カ オ ス ラ ウ ン ジ ゆ る せ な ぁ い ー
0364デフォルトの名無しさん
垢版 |
2011/07/27(水) 16:02:15.11
the art of computer programinngの2巻の証明の行間が開きすぎだったから
細部まで証明しましたが何か?
0366デフォルトの名無しさん
垢版 |
2011/08/02(火) 16:16:05.44
擬似乱数の偏りってビットごとの偏りとか周期性もちゃんと見たほうがいいと思うんだけどねえ。
乱雑性検定の一覧とか出したほうがいいんじゃないの
0368デフォルトの名無しさん
垢版 |
2011/08/02(火) 19:08:01.33
その、「ビットごとの」は「周期性」にもかかってる?

ていうか現代的な生成法で特定のビット位置のみ変な特性があるとかまず考えられないように思うけど。
線形合同法ぐらいだと下の桁はダメダメだが。
0369デフォルトの名無しさん
垢版 |
2011/08/02(火) 19:15:45.81
>「精度」はどのくらいのビット数で示される範囲で乱数になっているかという意味で使われているようです。
これ、初期値によっちゃ10個ぐらい0が続いてもどうする?
0370デフォルトの名無しさん
垢版 |
2011/08/02(火) 19:17:27.23
>>367
そうなんだけど>353の人にお勧めしたい。
ちゃんとした統計を取る気があるが知らないだけのようなので。

>>368
両方。ビットの周期性も、全体としての周期性も。
線形合同法を意識して書いたからその通りですね。
0371デフォルトの名無しさん
垢版 |
2011/08/02(火) 19:45:25.22
> どのくらいのビット数で示される範囲で乱数になっているかという意味

数式で書いてくれ、で終わりだろこんな文
0374デフォルトの名無しさん
垢版 |
2011/08/03(水) 19:57:03.18
見て楽しいかどうかは人それぞれ 4ビットでシフトレジスタ
ttp://upload.wikimedia.org/wikipedia/commons/7/7f/LFSR-F4.GIF
0380デフォルトの名無しさん
垢版 |
2011/08/04(木) 12:20:06.08
すごいすごいすごい
ハミング距離を知っているなんて凄いねーー
エライネー
天才だね〜
0388デフォルトの名無しさん
垢版 |
2011/11/23(水) 22:57:01.60
出力範囲が1000(10ビット未満)というのもな
32ビット精度必要なら4個を組にして使うわけだが,その上での一様性も相当疑わしい
0390デフォルトの名無しさん
垢版 |
2011/12/09(金) 20:48:49.64
お知識拝借
次のような擬似乱数生成方法を探しております
シード(頻繁には変化しない入力値)のほかにいくつかの入力値(頻繁に変化、1,2,3など近い値が入力される)
があって、それら入力値を入れると必ず決まった擬似乱数を生成する、というような乱数生成方法
当初XorShiftをアレンジすれば出来ると思ったのですが、シード以外の入力値が近いと
結果返ってくる値も近いようなものしか出来ず使えませんでした。
こういったタイプの擬似乱数関数として良好なものはありますでしょうか
もしくはどういった風にXorShiftを改造すればこういったものが実現できそうでしょうか
乱文失礼、お力添えお願い申し上げます
0391デフォルトの名無しさん
垢版 |
2011/12/10(土) 01:02:45.31
要するにハッシュ関数的な要素が欲しいんでしょ
入力値のハミング距離が近くても出力値のハミング距離が遠くなるように
ハッシュ関数通せばいいよ
0394デフォルトの名無しさん
垢版 |
2011/12/10(土) 01:37:08.54
>>390
どれぐらい「近いようなもの」でなければよいのか、
はっきりしてもらわないと何ともならんのじゃないか?
0396デフォルトの名無しさん
垢版 |
2011/12/10(土) 02:29:28.25
>>393
お恥ずかしながらおそらくそれをしていました

>>394
32bitですねfloat精度程度

入力値もfloat3つ程度、シェーダーでノイズを作るような目的です
だから欲しいのは
ulong32 Noise(ulong32 x,ulong32 y,ulong32 z,ulong32 seed)
で当初XorShiftの4つにこれを当てはめて数回振っていましたが
どうも模様が見えてしまう結果になります

ハミング距離が遠くなるようなハッシュ関数考えてみます
0398デフォルトの名無しさん
垢版 |
2011/12/11(日) 08:35:49.22
他の人たちは 390 が何をしたいか分かったの?
もっとちゃんと問題を定義したらズバリの答えが出る気がするけど。

>>396
余計なお世話かもしれないが、単精度浮動小数点数の乱数を作るのは
(rand() & 0x7fffff) | 0x3f800000
として [1.0 .. 2.0) を作り、必要に応じて線形変換するのが常道。
バイアス部分にも乱数のビットを埋めるのは好ましくない。
で、もし本当に 32bits 必要なら、単精度じゃなくて倍精度を選ぶべきかもしれない。

> どうも模様が見えてしまう結果になります
これが周期の問題なのだとしたら、余計なことしないで単にメルセンヌツイスターを使うだけの方が乱数性も処理速度も好ましいものになるだろう。
0399デフォルトの名無しさん
垢版 |
2011/12/11(日) 08:58:54.46
>>396
低周波成分(いわゆる模様)の無いノイズが欲しいなら
それは乱数ではなく、乱数から低周波成分を除く加工をして作る数列
ブルーノイズとか
0400デフォルトの名無しさん
垢版 |
2011/12/12(月) 19:02:48.17
>>398
>(rand() & 0x7fffff) | 0x3f800000
>として [1.0 .. 2.0) を作り、必要に応じて線形変換するのが常道。
これは知らなかった。
rand() / (RAND_MAX_1)とばかり。
0408デフォルトの名無しさん
垢版 |
2011/12/30(金) 00:08:06.52
もうJKISS32でいいんじゃないか。周期も2^121くらいあるみたいだし。
http://www.cs.ucl.ac.uk/staff/d.jones/GoodPracticeRNG.pdf

/* 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なのか
加算の使い方がまたなんとも
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の差はどちらもオーダー的にほとんど変わらないのだけど、
0414デフォルトの名無しさん
垢版 |
2012/07/24(火) 09:00:13.60
>>412

よく分からなかったけど、メルセンヌツイスターとかでも%で余りを求めるやり方はいけないの?
それとも線形合同法に限った問題なん?
0418デフォルトの名無しさん
垢版 |
2012/07/24(火) 17:06:19.28
>>416
それって RAND_MAX が 16 だとして、rnd % 10 とかで計算したら、って話?
そりゃ普通は、はみ出る部分の値が出たら捨てるだろ。
0419デフォルトの名無しさん
垢版 |
2012/07/24(火) 17:57:44.60
>>418
普通の知能の持ち主が剰余を使うならそうだが、剰余を使うほとんどの連中はそんなことはしないだろう
0422デフォルトの名無しさん
垢版 |
2012/07/25(水) 06:50:57.92
線形合同法は比較的単純な弱点が多いから、使う側が完全に把握して使うべきであって、
ライブラリ側でそういう配慮をするのはよくない(そういう配慮をして、ブラックボックス的に
使わせるなら他の生成法にすべき)。
0423デフォルトの名無しさん
垢版 |
2012/07/30(月) 22:53:54.77
久々に見たらスレが進んでいるなと思ったら

>>411
> 1000000回、乱数を生成して比較してみたけど、平均値と0.5の差はどちらもオーダー的にほとんど変わらないのだけど
これは本当にひどい
高校生でさえ鋭い奴は問題に気が付くレベル
0424デフォルトの名無しさん
垢版 |
2012/08/01(水) 07:50:35.33
>>413
それを定量的に調べる方法はありますか?
0426デフォルトの名無しさん
垢版 |
2012/08/03(金) 08:40:44.06
メルセンヌ・ツイスタでseedはどうやって与えれば良いの?
0428デフォルトの名無しさん
垢版 |
2012/08/03(金) 09:07:33.39
それやってみたのですが、最初の方は似たような数字になってしまいます。
0429デフォルトの名無しさん
垢版 |
2012/08/03(金) 09:17:44.87
内部状態が2kバイト強あるから、先頭から4kバイト弱ぶんぐらい読み飛ばす。

あと、十分な量のseedを与えることができるインタフェースが用意されてないか、確認する。
0434デフォルトの名無しさん
垢版 |
2012/11/20(火) 11:52:42.11
rand(0)とrand(1)どちらも同じ乱数列を生成するのですが、
そのように決まっているのですか?
それともたまたま使っている処理系が、0と1で同じ乱数列を吐き出すのですか?
0435デフォルトの名無しさん
垢版 |
2012/11/20(火) 12:10:19.47
rand()って引数いらんのでは?
説明めんどいからsrandも調べてみ
色々わかるから

ちなみにrand()は精度低い乱数
0436デフォルトの名無しさん
垢版 |
2012/11/20(火) 12:36:34.27
>>434
お使いの処理系のマニュアルをご覧ください。

つーか、言語も何も判らんのに答えられるわけないとは思わないもんなのだろうか。
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)'のことだった(笑)。
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
擬似乱数が真の乱数に近づく条件は周期を無限大にすること、
周期が長いとどういうことが起きるか?
数値の分布が極所で揺らぎ(歪む)出すってこと

質の良い擬似乱数は使う範囲において一様性の分布が求められる
例えば1から6までのサイコロを演出したとき1万回振って
どの目もほぼ同じ確率になること。

これが1京の1京乗回となる場合に1万回部分の区切りの中が同じ一様性
であるかは別の話しとなる。1京の1京乗回行えば1万回分サイコロを振った
分布より確実にどの目も同じになるわけで、どの側面で優秀かは別の話しである。

暗号のソースである良い擬似乱数とは予測困難性の高いことである、
それは一様性が確実であれば1万回振ったとき最後の1回は高い確率で
予測できてしまう。それはその周期でどの目も一様に分布するから
その性質を維持する為に1万回目は過去のデータから特定できる
ってことである。
0447デフォルトの名無しさん
垢版 |
2013/12/25(水) 19:06:16.80
計算で求められる擬似乱数に秩序などないと考えるバカがいるが
擬似乱数を求める式でその擬似乱数を割り切れるという秩序がある。
同じ計算が同じ結果を出すのは当たり前すぎる。
方法が統一されているそれは次の値がでるパターンが前の目で確定している
性質があるってことだ。その連続性が膨大であるから困難だと説明している
のにすぎない。
だが桁数が小さいその擬似乱数が困難だというのは過去の話しである。
いつまで困難だと思っているか、バカには理解できない領域である。
0451デフォルトの名無しさん
垢版 |
2013/12/26(木) 10:18:01.99
>>446 447 はただのバカ。「疑似乱数列」「暗号学的に安全」「真の乱数」といった言葉を、
まるっきり俺様定義で使ってるから、全くの意味不明なナンセンス文になっている。
0454デフォルトの名無しさん
垢版 |
2014/01/03(金) 23:06:25.84
過去数十年にわたって、数多くの研究者が乱数列の様々な評価法を考えてきたというのに、
それら全てを無視して、俺の能力ならすばらしい評価関数が作れる、ってか? すごい自信だな。

(普通、そういうのを「バカ」と言う)
0457デフォルトの名無しさん
垢版 |
2014/01/04(土) 23:19:34.15
数学を知らずに数学を知ったかのように語るやつっているけど、
たんなる感情論だよね、観念の類を定義して方程式で証明する構図は
まったく具体性のない幻想とまで皮肉をいったり悪口を言う輩がいるが
それは間違いない、幻想でいいんだよ。
方程式そのものは美しさとその完璧なる秩序の明確性を説明するもので
現実を表す物理のような実証ではない、証明と実証の区別ができないのが
実証(具体性)ばかりこのみ難しい数学の領域の記号だけの記述になると
3行しか読めないコピーペーの能力ではどうにもならない。
暗記してできるものでもない。
0458デフォルトの名無しさん
垢版 |
2014/01/06(月) 09:52:48.11
方程式や論理式に現実性がない、だと?

じゃあ、方程式や論理式を駆使して設計されている飛行機やコンピュータはいったいどうなるんだ。
飛行機やコンピュータは幻想なのか?
0461デフォルトの名無しさん
垢版 |
2014/01/07(火) 11:53:33.12
鉄の塊は、レシプロ機のエンジンぐらいだな。高機能樹脂ができる前は軽合金、その前は木と布だったw
「機」(本来は、織機のように木などで出来た、軽いものを指す語)を使うのは伊達じゃない。
0463デフォルトの名無しさん
垢版 |
2014/03/27(木) 03:02:18.88ID:2kZbCKHg
7年も前のスレを読み返すと時代の変遷を実感できる。
>>226>>390の質問は最近の並列化乱数の流れに繋がる。
ここ2、3年の展開では、
Parallel random numbers: as easy as 1, 2, 3
//www.thesalmons.org/john/random123/papers/random123sc11.pdf
Deterministic parallel random-number generation for dynamic-multithreading platforms
//supertech.csail.mit.edu/papers/dprng.pdf
今、メニーコアのCPUで動的負荷分散したいと皆考えてる。
近々MT以来のブレークスルーがあるような気がするな、、
0466デフォルトの名無しさん
垢版 |
2014/04/25(金) 13:01:06.17ID:bY1/N1n7
一様な分布である乱数(「一様分布に従う乱数」)どうしの和は、一様な分布にならない。


一様乱数の和の確率分布は、個数 n が増えるにつれて急速に正規分布に近づく(「正規分布に従う」)

2個の和
12個の和

図 5-1 Monte-Carlo実験による[0,1)一様乱数の和の分布
2個の和(左)12個の和(右)
http://econom01.cc.sophia.ac.jp/sda/normal.htm
0469デフォルトの名無しさん
垢版 |
2014/04/26(土) 04:34:51.11ID:VGFQwx9o
不思議なの?
結果の数値を表す組み合わせの存在ってだけだと思うんだけど
0470デフォルトの名無しさん
垢版 |
2014/04/27(日) 21:38:54.17ID:dRMpu4rZ
一様乱数ですら足して足してでガウス分布に近づいていく、というのだからねえ‥‥手元の教科書は証明抜きだ‥‥凡人には理解できない世界なのか?
0471デフォルトの名無しさん
垢版 |
2014/04/27(日) 21:57:22.77ID:J+hFW2BD
ごく単純に 2D6 とか 3D6 を....6面のサイコロを2個とか3個とか振って、出た目の合計とか、
考えてみればいいじゃないか。
0473デフォルトの名無しさん
垢版 |
2014/11/09(日) 14:21:04.82ID:iOEsToOb
メルセンヌツイスタが最強
0474デフォルトの名無しさん
垢版 |
2015/12/18(金) 13:17:24.11ID:kGnyy2oJ
xorshift128+ってのが今はいいのかな
0476デフォルトの名無しさん
垢版 |
2016/03/19(土) 17:07:51.05ID:nABaYqd9
xorshift1024*てえのが最高品質なうえに速度もトップクラスだぜとテスト結果を示して自信満々だが
なんだか話がうますぎてほんまかいなという気もする
http://xorshift.di.unimi.it/

32ビット型の扱いが最も効率良い言語の方がまだ多そうだからそっちで返してほしいのもあるな
返し方で調整できるといえばそうなんだけど
0477デフォルトの名無しさん
垢版 |
2016/03/29(火) 09:31:35.21ID:/c8bAcK4
サッカーブッシュ日本代表日程ぷあたん(しゅっちょうまいくろ教育長交代)春文執行40代売上差額シュガーチョコ
https://www.youtube.com/watch?v=NDq1QoJY0nY宇ドナルドアナリストパワーストーンコーチングとしまえん
サッカーブッシュ日本代表日程古本屋よしたけしゅっちょうちょこしゅがー
ディーラー税務署天才開発者死亡詰みヨミドクターマイクロサービス不足
サッカーブッシュ日本代表日程ぷあたんシフト光金さかい強制バイト人権侵害問題
春分資源執行ニューヨーク低原価ぼったステーキソルトレイク福岡横浜新橋奴隷課金パチシフト強制バイト問題新潟米センター生残
コスメ24チャリティー隠れ40代生活保護プレイボーイバイトレードいたりあん接待問題
マスコミKARDローンケーオーサービス不足婚活パーティー寄付金執行原発ビジネス
FBIチャイニーズタイホテル売上事務所ガチャ決算ガチャキャンペーン(販売報道陣過激派組織向携帯最新情報提供終了
校長発言細心注意ノートン産廃エラー(著作権クレーム中国反応融資高額教育費)(中国捕鯨団体40代社員サッカーコメント
高額入学金ヤフウ新橋大学ヤフウ新橋理事長FX経費 おじや50代資産ガリバズフィード40代エリート
0478デフォルトの名無しさん
垢版 |
2016/03/29(火) 19:54:10.75ID:B5K8vkuQ
>>476
やっていることは既存のxorshiftのアルゴリズムだな
内部で保持するシード列が64ビットになってその保持数が増えたって感じだね
速度は早いかもしれんが、乱数列としての質はどうなんだろうな
マジックナンバーの積算があるのが気になるw

汎用性から見てMTが最強には変わらないと思うよ
0479デフォルトの名無しさん
垢版 |
2016/03/31(木) 20:16:33.23ID:cjJ70n7R
とりあえずで利用するならSFMTとは思った
テスト結果どおり,統計的におそろしく性質がいいと分かってきたらまた見方が変わるかもしれん
0480デフォルトの名無しさん
垢版 |
2016/09/21(水) 12:21:52.98ID:CD/L3vnF
ゲームに乱数が使われていると思うけど、この計算の占める割合って全計算のどのくらいの割合
なんでしょうか?
0482デフォルトの名無しさん
垢版 |
2016/09/21(水) 14:06:22.50ID:CD/L3vnF
全然大したことじゃないですか?
ほかのスレで、

ゲームサーバーでも対戦判定に莫大な回数の擬似乱数を回してパワーを食う

って書いてる人がいたんですけど
0483デフォルトの名無しさん
垢版 |
2016/09/21(水) 14:30:30.69ID:ib8am8Zc
この板の他のスレ?
それとも他の板のスレ?
この板のひとでそれを真に受ける人はいないと思いたい
0484デフォルトの名無しさん
垢版 |
2016/09/21(水) 14:43:40.10ID:CD/L3vnF
ポケモンのような大規模ゲームの場合でも、乱数発生の占める計算パワーは微々たるものですか?
0486デフォルトの名無しさん
垢版 |
2016/09/21(水) 17:34:47.65ID:yT1mont5
高速な物理乱数発生器なんて必要性ないですかね
0488デフォルトの名無しさん
垢版 |
2016/09/23(金) 10:57:39.17ID:fan7eHym
乱数発生が重くて困るとか、真正乱数がぜひほしいっていう話はないですか?
0490デフォルトの名無しさん
垢版 |
2016/10/05(水) 13:39:42.79ID:39LeL7K0
xorshift64 で検索したらいいじゃん。
0492デフォルトの名無しさん
垢版 |
2016/10/05(水) 15:09:17.42ID:ZsK4JXk7
>>489
(・∀・)つ ホレ!
ttps://www.jstatsoft.org/article/view/v008i14/xorshift.pdf

Marsaglia先生が詳しく解説してくれてる
0495デフォルトの名無しさん
垢版 |
2016/10/06(木) 07:29:45.67ID:iNNf2EsF
こういう厚かましい無能が現れるのも乱数性のなせるわざか。
0496デフォルトの名無しさん
垢版 |
2016/10/06(木) 08:30:59.70ID:2aWpWU4C
三木さんに新しい疑似乱数生成方式を考案してほしい
三木乱数で

ミキさんに考えてもらって乱数ミキでもいい
0497デフォルトの名無しさん
垢版 |
2016/10/06(木) 12:12:14.44ID:Yw0Cruyw
線形合同法は、下位ビットが偏る

メルセンヌツイスター、1996の方が、周期が長い

Xorshift、2003は高速
0498デフォルトの名無しさん
垢版 |
2016/10/08(土) 06:01:51.17ID:KfBpvv2w
順番性のテストをしたことあるけど、
xorshiftは異常なほど結果が偏ってるよ。
逆に線形合同法は異常なほど分散する。

結局、統計学や確率論などの乱数の順番が重要になる処理では結局どちらも使えない。
例えば、rand(100)で 5回連続で 20以下が出るかどうか。などの処理確率の信憑性が極めて疑わしい。


ちなみにテストはいろいろやったけど、xorshiftのおかしさが一撃でわかるのが x座標y座標と順番に出して印をつけてく方式。
線形合同法に至っては、rand(100) を100個出すだけで十分。確率上あり得ないくらい重複が少なく綺麗に分散する。


線形合同法は、下位ビットのかたよりがすぐ話題になるが、1/max の精度で乱数を必要とすることがあまりないのでけっこうどうでもいい。


ちなみに俺はここ数年、線形合同法で最初のseed設定時に乱数を1024個プールして、
array[rand(max) % 1024];
みたいな感じでランダムで取り出して使う。(そしてそこに次の乱数をセットする)。
って感じの自作汎用dllを使ってる。
トランプだって、2度シャッフルすればもう最初の並び順との因果関係は誰にも発見出来ないってね。


まぁメモリは多少食うし速度も最速じゃないけど、別に最速最小を求めるような研究者じゃないし。俺は。
0499デフォルトの名無しさん
垢版 |
2016/10/08(土) 07:32:49.80ID:U+ATce89
>>498
とりあえず、全bit使おうとするのは良くないというのは基本だと思うが

だからこそ、内部で32bitとかで種を持っているにもかかわらず、
標準Cでの要求が14bitとかそういう話になる

単純に割って使う(シフトでの下位bit切り捨てに相当)んじゃなく、上位もマスクして切り捨てて使うのが常識
0500デフォルトの名無しさん
垢版 |
2016/10/08(土) 07:47:16.98ID:PgGGpXVn
>>498
>ちなみに俺はここ数年、線形合同法で最初のseed設定時に乱数を1024個プールして、
>array[rand(max) % 1024];
>みたいな感じでランダムで取り出して使う。(そしてそこに次の乱数をセットする)。

それはDonald Knuth先生のリオーダーアルゴリズムBに近いな
内部のバッファリングは256だけどC++のstd::knuth_b(シャッフルオーダーね)がある
0501デフォルトの名無しさん
垢版 |
2016/10/08(土) 14:10:54.10ID:PgGGpXVn
>>498
>rand(max) % 1024
この部分は下位ビットの偏りが諸に関連しているよ
因みにstd::knuth_bではstd::minstd_rand0を元にバッファサイズで正規化して
値を取り出しているから、その演算のせいで他のに比べると重い
周期も数学的に不明だったかな
0502デフォルトの名無しさん
垢版 |
2016/10/08(土) 18:34:54.73ID:KfBpvv2w
あんま深く考えてなかったけどそうかもね。
ただし検定は通ってるから、まあいいっちゃいいけど。

実用上の実質的な周期はそのまま線形合同法と同じだよ。
まあ300回くらいなら多く回しても実用上にも問題ないけど、そんなのは計算しない。

>rand(max) % 1024
これは素数にすることでノーコストで解決できるから気が向いた時にでもやっとくよ。
ただ、どんなに下位ビットが偏ってた所で、
araay[988]の中身 と araay[986]の中身の因果関係、もしくは共通点は何か、と聞かれても判明させるのは不可能に近いと思うけどね。

>上位もマスクして切り捨てて使うのが常識
ただ線形合同法はそれでいいとしてxorshiftは捨てるべきビットが特定できないような?


まあ俺はシャッフルして何も捨てないのが好きらしい。
全部が若干遅いんだけどね。特にseed植える時。
0503デフォルトの名無しさん
垢版 |
2016/10/26(水) 12:50:05.40ID:X3TP1P6r
奥村先生のアルゴリズム事典にある乱数の改良法だぬ

xorshiftは生で使うと俺も気持ち悪さを感じるので線形合同法を足してる
0504デフォルトの名無しさん
垢版 |
2016/12/10(土) 11:46:44.94ID:DCOx50tb
統計の知識は中高どまり(平均・中央値・分散程度か)なので
乱数用に内部状態が32ビットしか確保できないソフトに対して単にxorshiftを採用して「検定もいい結果らしいし」と気にしていなかった

思ったより良くないとなると,プールしておいてランダムに取り出す方法も使えないし悩むな
0505デフォルトの名無しさん
垢版 |
2016/12/14(水) 12:22:06.08ID:7W6mxi0O
1個使ったら100個捨てるとか
RNGが保証してるのは周期だけだと割りきって頑張って調律するとか
0506デフォルトの名無しさん
垢版 |
2016/12/14(水) 23:07:36.84ID:2UzQxrtp
素人の生半可なオレオレ乱数はやらない方が身のため
0509デフォルトの名無しさん
垢版 |
2017/01/05(木) 01:13:53.38ID:yRe7g27Q
一個使って100個捨てるとか馬鹿の極み
コストを101倍にしてどうする。
コスト2倍も出せば問題のない乱数を作れるのに
0511デフォルトの名無しさん
垢版 |
2017/01/05(木) 20:10:30.85ID:atmVS5w4
S/N比最低というのは、乱数としては素晴らしいことだ。
0516デフォルトの名無しさん
垢版 |
2017/02/22(水) 09:56:53.06ID:BVjvbr4Q
「14試合×5口分の予想結果が2回続けて全く同じという極めて不自然な結果が出力され、
システムの不具合や不正ではないかと一騒動となっている(中略)
日本スポーツ振興センターと楽天から調査結果の発表がなされたのだが、
くじは確かに販売されたものである」

スポーツくじ「BIG」でランダムなはずの予測結果が2連続で一致するも「偶然」との回答 - エキサイトニュース
http://www.excite.co.jp/News/it_g/20170221/Slashdot_17_02_20_1619238.html
2017年2月22日 09時50分
0517デフォルトの名無しさん
垢版 |
2017/02/22(水) 12:02:19.51ID:Acz49b5N
一人が予想して当たればその確率かもわからんけど、
1000人が予想した場合の期待値は1000倍になるんじゃね
0519デフォルトの名無しさん
垢版 |
2017/02/23(木) 07:17:16.12ID:WFbVQHcp
数枚買ったうちの2枚が連続して同じだったのか
そりゃ金返せってなるな

最初から買わんけど
0520デフォルトの名無しさん
垢版 |
2017/02/23(木) 07:23:45.91ID:WFbVQHcp
セキュリティ上の理由から
アルゴリズム公開しないって書いてあるけど
全組み合わせを逐次予想するんじゃなくて
元々予想したくじを用意してあって
そこから適当に買った枚数分選んでくるとかだったら
重複確率は上がりそうだな

たまたま購入者が気付いただけで
気付かずに捨てられた券で
過去の重複してたのもっとあるんじゃないか
0521デフォルトの名無しさん
垢版 |
2017/02/23(木) 08:54:22.37ID:907E0Xet
どんな擬似乱数でも、内部的に状態を示す値を保持していて、それを元に次回の乱数を計算で出す
その値を初期化するのがsrand等だけど、その時に限らず常に値は持っているので
偶然内部の値が同じなんてこともよくある

ただし、普通は同じ値であっても、別の用途に乱数を使うので、同一であったことが問題になることはない

けれど、もし、14試合分の予想の直前の段階での内部的な値が、前回と全く同じ値だったとすると
そこから算出される各試合結果を示す乱数も、全く同じ値が出て
予想結果も全く同じものになる


偶然同じ状態値を持っている時に同じ買い方をしたために、全く同じ予想値になった

状態値のbit数が少ない(例えば普通に線形合同法だと32bitか)のを修正するか、
あるいはアルゴリズム的に同じ擬似乱数だけで順番に算出することを見直すか
そういうことをしないと、同じことが再び起こる可能性はある

擬似乱数だと防げないけどね


宇宙が始まるより低い確率云々ってのはナンセンス
擬似乱数の内部値が一致していて、単純に擬似乱数を利用するアルゴリズムだったというだけ
これは珍しいけど起こりうること
0523デフォルトの名無しさん
垢版 |
2017/02/23(木) 13:15:51.47ID:eG9NqkD/
>>521
状態機械で内部の値が一緒だったらその次もその次もずっと同じ値を出し続けるんじゃね
0524デフォルトの名無しさん
垢版 |
2017/02/23(木) 13:37:51.43ID:lN59Dhjm
真の乱数なら、種の設定は (少なくとも実用上は) いかなる場合も最初の一度きりで二度と結果がループすることはない
0525デフォルトの名無しさん
垢版 |
2017/02/23(木) 13:40:24.47ID:lN59Dhjm
と言っても宇宙の何かの物理法則が真の乱数を作ることはないのだろうと思うけど。
全ては必ず有限らしいし、その中でのチューリング完全なんだろうだし。
0528デフォルトの名無しさん
垢版 |
2017/02/23(木) 16:46:44.91ID:WFbVQHcp
>>526
なんらかのバグで内部状態が変化しなくなって
2回連続で同じ値を出してしまったら
再起動がかかるシステムだったりするかもしれない
0529デフォルトの名無しさん
垢版 |
2017/02/23(木) 21:50:11.33ID:5geihC2S
>>523
「前回(の乱数取得時)と同じ」という意味ではなく
「前回試合予想をした時と同じ」という意味ね

どちらも、同じ値から同じ試合の予想をして、
結果、前週と全く同じ予想が14試合x5口分で起きた
0532デフォルトの名無しさん
垢版 |
2017/02/25(土) 15:09:25.02ID:u8Ry8YI7
状態変数が同じになったから同じ数列が出たんじゃねーよ。
二セット分繰り返す数列を出力する状態変数だっただけだろ。

http://science3.2ch.net/test/read.cgi/math/1088351567/424-425
円周率の 93299341 桁目から 07214545 という数列が出るそうだ。
まあ大体その辺で出そうな桁数だ。
おそらく無限に調べれば 1/10,0000,000 より少しだけ少ない頻度で出現するだろう。
そしてそのうちの 1/10,0000,000 は二回続く、つまり 1/10+E16 程度で 0721454507214545 という数列が出現するであろう。

目立つ組み合わせだから話題だが、どの二セットを取っても、その組み合わせが発生する確率は同じだ。
0534デフォルトの名無しさん
垢版 |
2017/03/10(金) 21:31:43.44ID:ARsP6JfD
PCGってどうなん?
ttp://www.pcg-random.org/

説明読んだりビデオ観たりした限りでは優れているみたいなんだけども
アルゴリズム的には線形合同法とXorShiftのハイブリッドの様な感じで
結構単純な構造なんだけど、高速で良質な乱数を生成するとか

因みに2年前に発表されているみたいなんだけど知らんかったわ
0538デフォルトの名無しさん
垢版 |
2018/05/23(水) 20:53:42.20ID:Au5e7VGg
僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』

BZKM3
0539デフォルトの名無しさん
垢版 |
2018/07/05(木) 01:00:09.16ID:RfoszcD2
5E7
0540Goldwasser
垢版 |
2019/01/03(木) 13:41:14.69ID:r8gE2use
ご覧あれーw

#include "pch.h"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>

#define N 32

unsigned char x1[N], x2[N], x3[N];

void rp(unsigned char* a) {
int i, j, x;

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");

return 0;
}
0542Goldwasser
垢版 |
2019/01/03(木) 13:42:22.37ID:r8gE2use
最後

int main() {

rp(x1);
rp(x2);
data();

return 0;
}
0543デフォルトの名無しさん
垢版 |
2019/01/06(日) 08:57:50.46ID:kWOVO8kw
誰かTestU01の使い方を教えてください
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況