疑似乱数2

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2007/10/17(水) 22:34:59
擬似乱数発生器について語ろうか。その2

前スレ
擬似乱数
http://pc11.2ch.net/test/read.cgi/tech/1146071975/

関連スレ
【危険】とんでもプログラム告発スレッド【悪質】
http://pc11.2ch.net/test/read.cgi/tech/1191860116/


SIMD-oriented Fast Mersenne Twister (SFMT):
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/SFMT/index.html
2011/06/12(日) 19:32:33.48
RDRANDで疑似乱数オワタ?
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命令は統計的に均一かつ非周期的、非決定的なデータを生成することが保証されている。

オンチップ-エントロピー源の出来如何に関わるという印象を受けますが、さて、どうでしょうか?
2011/06/12(日) 22:06:24.66
なんで擬似乱数が終わるんだよ?
分からない奴は黙っとけ
2011/06/12(日) 22:08:35.00
容易に再現できる乱数列が必要な応用があるとか全く知らないんだろ
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です。
2011/06/16(木) 13:48:55.52
そもそもrandがスレッドセーフである保証がない。
スレッドセーフでない関数の読み出しにはロックをかけろ。

疑似乱数の実装がスレッドローカルならスレッドIDとタイムスタンプを組み合わせてseedに使うかな
2011/06/16(木) 21:37:26.52
>>340
rand_r()は実装されてないの?
シミュレーションとかに使うなら、当然もっとまともな乱数使うべきなんだけど
2011/06/16(木) 22:04:02.90
randってアルゴリズムからして処理系依存だから
ドキュメント読むしかないと思うが
2011/07/03(日) 19:51:40.73
2011年、Ruby,Perl,PHP,Pythonって並べたときにさ
ここで、Ruby以外を選ぶ奴ってマジでなんなんだろうな


ゴミは何いってもゴミ
2011/07/03(日) 20:36:04.58
おや知らないうちに、MTの周期の短い奴が
2011/07/03(日) 21:16:56.21
内部ベクトルぽ周期がxorshift128に似てるね
テストしてみるか
347デフォルトの名無しさん
垢版 |
2011/07/18(月) 01:12:26.71
初カキコというか質問があるんですが
2011/07/18(月) 01:23:00.97
うーん…
XorShiftでいいや。
349デフォルトの名無しさん
垢版 |
2011/07/18(月) 01:27:26.98
パワフルプロ野球スレでcupsを256にすれば天才選手(低確率で出る初期能力が強い選手)が出ると聞きました
乱数のことはよくわからないんですがそのcupsという項目があって
それを256に合わせればいいという認識でよろしいんでしょうか

それがあってるとして、
乱数は数値化しないとそれにあわせることはできないのでしょうか
もしくは数字だけが分かっていればなんとかなるものですか?
2011/07/18(月) 01:28:07.97
すいません…ageてしましました…
2011/07/18(月) 01:35:15.25
ゲームの話は板違い
352デフォルトの名無しさん
垢版 |
2011/07/18(月) 01:37:58.95
>>351
しゅません、ここしか見つからなくて…
2011/07/25(月) 07:45:02.26
>>348
ttp://raluck.exblog.jp/7153886/
2011/07/25(月) 19:27:51.78
乱数の「精度」って記述初めて見たぞ?言いたいことは判らなくも無いが。
2011/07/25(月) 19:32:37.26
普通、品質って言うわな。

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

誰だよほんとにもう。
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
「精度」はどのくらいのビット数で示される範囲で乱数になっているかという意味で使われているようです。
つまり品質の一部分ですね。
2011/07/26(火) 12:37:39.46
それはwikipediaのノート内で議論すべきでは
2011/07/26(火) 19:22:02.57
漏れは精度っていうのは誤差の大小だと思っていた。
2011/07/26(火) 19:28:23.63
一体何の誤差なのか
2011/07/26(火) 20:21:03.30
理想的な分散から外れる誤差というのはあるんじゃね
363ななし。
垢版 |
2011/07/27(水) 14:04:51.54
カ オ ス ラ ウ ン ジ ゆ る せ な ぁ い ー
2011/07/27(水) 16:02:15.11
the art of computer programinngの2巻の証明の行間が開きすぎだったから
細部まで証明しましたが何か?
2011/07/27(水) 22:37:01.04
頭いいね!
2011/08/02(火) 16:16:05.44
擬似乱数の偏りってビットごとの偏りとか周期性もちゃんと見たほうがいいと思うんだけどねえ。
乱雑性検定の一覧とか出したほうがいいんじゃないの
2011/08/02(火) 16:42:04.28
まさにそれをやってるのがdiehard testsじゃないの
2011/08/02(火) 19:08:01.33
その、「ビットごとの」は「周期性」にもかかってる?

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

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

数式で書いてくれ、で終わりだろこんな文
2011/08/03(水) 04:39:55.82
それより問題は>>348がTinyMTを試した結果なぜXorshiftを選択したかだな
2011/08/03(水) 19:21:14.73
内部ベクトルって見て楽しいのかね
2011/08/03(水) 19:57:03.18
見て楽しいかどうかは人それぞれ 4ビットでシフトレジスタ
ttp://upload.wikimedia.org/wikipedia/commons/7/7f/LFSR-F4.GIF
2011/08/04(木) 00:13:01.69
楽しくなければ乱数じゃない!
2011/08/04(木) 09:30:26.00
グレイコードってやつだな。
2011/08/04(木) 10:37:52.94
グレイコードは1度にハミング距離が1しか変化しないコードだろ
2011/08/04(木) 10:48:53.38
なんだ・・・ただ1づつ足していくだけかクダラネ。
2011/08/04(木) 12:02:14.43
ハミング距離も知らんのか
2011/08/04(木) 12:20:06.08
すごいすごいすごい
ハミング距離を知っているなんて凄いねーー
エライネー
天才だね〜
2011/08/04(木) 19:22:19.62
いやあそれほどでも(クィッ!
2011/08/26(金) 11:30:52.08
復帰
2011/11/07(月) 00:15:56.56
擬似乱数ではないのでスレ違いかもしれないが
ちょっとコンセプトを思いついたので実装してみた。
http://netrand-test.appspot.com/
2011/11/07(月) 00:34:50.29
何に使うんだそれは
2011/11/07(月) 07:01:49.82
/dev/random のような用途?
386デフォルトの名無しさん
垢版 |
2011/11/23(水) 11:19:10.85
なんか加減算だけでそれっぽいのができたぜ

http://www42.atwiki.jp/syugyou?cmd=upload&act=open&pageid=250&file=mon13.html
2011/11/23(水) 22:49:37.46
>>386
SFMTに対して、どこがアドバンテージあるの?
周期2^216091-1とかだぞ。
2011/11/23(水) 22:57:01.60
出力範囲が1000(10ビット未満)というのもな
32ビット精度必要なら4個を組にして使うわけだが,その上での一様性も相当疑わしい
2011/11/24(木) 08:38:35.87
出現回数をカウントできるようにしたぜ
2011/12/09(金) 20:48:49.64
お知識拝借
次のような擬似乱数生成方法を探しております
シード(頻繁には変化しない入力値)のほかにいくつかの入力値(頻繁に変化、1,2,3など近い値が入力される)
があって、それら入力値を入れると必ず決まった擬似乱数を生成する、というような乱数生成方法
当初XorShiftをアレンジすれば出来ると思ったのですが、シード以外の入力値が近いと
結果返ってくる値も近いようなものしか出来ず使えませんでした。
こういったタイプの擬似乱数関数として良好なものはありますでしょうか
もしくはどういった風にXorShiftを改造すればこういったものが実現できそうでしょうか
乱文失礼、お力添えお願い申し上げます
2011/12/10(土) 01:02:45.31
要するにハッシュ関数的な要素が欲しいんでしょ
入力値のハミング距離が近くても出力値のハミング距離が遠くなるように
ハッシュ関数通せばいいよ
2011/12/10(土) 01:04:32.98
ハッシュ関数、初耳ですがちょっと調べてみます
2011/12/10(土) 01:13:57.92
毎回srandしてるようにも読めるな
そうでないなら適当に読み捨てれば?
2011/12/10(土) 01:37:08.54
>>390
どれぐらい「近いようなもの」でなければよいのか、
はっきりしてもらわないと何ともならんのじゃないか?
2011/12/10(土) 01:39:31.04
ハッシュ関数知らないレベルだから改善の余地は大いにありそうだが
2011/12/10(土) 02:29:28.25
>>393
お恥ずかしながらおそらくそれをしていました

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

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

ハミング距離が遠くなるようなハッシュ関数考えてみます
2011/12/10(土) 02:45:34.85
典型的にはZobrist Hashingが使える
2011/12/11(日) 08:35:49.22
他の人たちは 390 が何をしたいか分かったの?
もっとちゃんと問題を定義したらズバリの答えが出る気がするけど。

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

> どうも模様が見えてしまう結果になります
これが周期の問題なのだとしたら、余計なことしないで単にメルセンヌツイスターを使うだけの方が乱数性も処理速度も好ましいものになるだろう。
2011/12/11(日) 08:58:54.46
>>396
低周波成分(いわゆる模様)の無いノイズが欲しいなら
それは乱数ではなく、乱数から低周波成分を除く加工をして作る数列
ブルーノイズとか
2011/12/12(月) 19:02:48.17
>>398
>(rand() & 0x7fffff) | 0x3f800000
>として [1.0 .. 2.0) を作り、必要に応じて線形変換するのが常道。
これは知らなかった。
rand() / (RAND_MAX_1)とばかり。
2011/12/12(月) 19:13:08.54
fmul一回分だけお得と
まあ大抵は再度後から掛けるだろうけど
2011/12/14(水) 20:11:28.68
9bit損するからじゃね?
2011/12/21(水) 14:23:42.69
音のノイズなら線形合同のほうがいいよ
偏りや周期を聞き分ける人がいたら神だよ
2011/12/24(土) 15:01:03.98
上位ビット使うんだぞ
2011/12/24(土) 18:33:56.26
気をつけます。
2011/12/25(日) 00:38:03.89
>>403
ダイナミックレンジ広いと偏りはわからんが、周期は聞こえるぞ
2011/12/25(日) 10:38:56.24
線形合同法でノイズ作ったぜ

http://www42.atwiki.jp/syugyou?cmd=upload&act=open&pageid=250&file=oto2.html
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;
}
2011/12/30(金) 16:57:53.03
129ビットぶんの状態があるように見えるけど周期は2^121なのか
加算の使い方がまたなんとも
2012/01/02(月) 18:16:00.13
L・C・G!L・C・G!
411デフォルトの名無しさん
垢版 |
2012/07/24(火) 08:00:03.47
wikipediaにある
'特定の範囲で乱数を求めたいときにはa = rand() % 10とする方法も広く知られているが、線形合同法などの下位ビットの乱数としての品質が低い生成法に備えるため上記のコード例のような上位にあるビットを利用するコードが推奨されている'
ってどいういうこと?
(int)((rand() / ((double)RAND_MAX+1.0)) * 2);

rand()%2
で1000000回、乱数を生成して比較してみたけど、平均値と0.5の差はどちらもオーダー的にほとんど変わらないのだけど、
2012/07/24(火) 08:24:36.56
面倒だから
乱数 下位ビット
でググってもらっていいかな。
2012/07/24(火) 08:26:01.03
>>411
品質が悪いと、奇数偶数が交互にしか出なかったりする。
414デフォルトの名無しさん
垢版 |
2012/07/24(火) 09:00:13.60
>>412

よく分からなかったけど、メルセンヌツイスターとかでも%で余りを求めるやり方はいけないの?
それとも線形合同法に限った問題なん?
2012/07/24(火) 09:04:24.07
MTはかまわないよ
だめなのは質の悪い乱数に限った話
線形合同法はその代表格
2012/07/24(火) 15:07:40.15
%は法の数が大きいと分布の偏りが大きくなる。
2012/07/24(火) 16:50:20.82
>>411
酷い実験してるなw
頼むからブログとかでどっちも変わりませんでしたとか書かないでくれよww
2012/07/24(火) 17:06:19.28
>>416
それって RAND_MAX が 16 だとして、rnd % 10 とかで計算したら、って話?
そりゃ普通は、はみ出る部分の値が出たら捨てるだろ。
2012/07/24(火) 17:57:44.60
>>418
普通の知能の持ち主が剰余を使うならそうだが、剰余を使うほとんどの連中はそんなことはしないだろう
2012/07/24(火) 19:19:37.18
法(のり)
2012/07/24(火) 20:14:18.94
>>414
今は線形合同法といっても、計算で仕様するビット全部ではなく、上位の一部を表に返す、とかするものもあるようだ。
http://en.wikipedia.org/wiki/Linear_congruential_generator
2012/07/25(水) 06:50:57.92
線形合同法は比較的単純な弱点が多いから、使う側が完全に把握して使うべきであって、
ライブラリ側でそういう配慮をするのはよくない(そういう配慮をして、ブラックボックス的に
使わせるなら他の生成法にすべき)。
2012/07/30(月) 22:53:54.77
久々に見たらスレが進んでいるなと思ったら

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

あと、十分な量のseedを与えることができるインタフェースが用意されてないか、確認する。
2012/08/03(金) 09:22:52.54
>>428
それ、小さいシードで初期化するときの実装が古いやつなんじゃないか?
2012/08/03(金) 09:27:16.85
何万個か読み捨てればいいよ。
2012/10/01(月) 07:40:42.45
Perlでメルセンヌツイスタをつかえますか?
2012/10/01(月) 09:10:34.08
うん
434デフォルトの名無しさん
垢版 |
2012/11/20(火) 11:52:42.11
rand(0)とrand(1)どちらも同じ乱数列を生成するのですが、
そのように決まっているのですか?
それともたまたま使っている処理系が、0と1で同じ乱数列を吐き出すのですか?
2012/11/20(火) 12:10:19.47
rand()って引数いらんのでは?
説明めんどいからsrandも調べてみ
色々わかるから

ちなみにrand()は精度低い乱数
2012/11/20(火) 12:36:34.27
>>434
お使いの処理系のマニュアルをご覧ください。

つーか、言語も何も判らんのに答えられるわけないとは思わないもんなのだろうか。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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