掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.28493

傾向のある乱数
投稿者---VLI2(2006/10/15 23:47:01)


はじめまして。
一様乱数を作りたいのですが、吐き出す値に傾向があります。
具体的には、添付するプログラムで乱数を作ると、
一回目: 0.73 0.18
二回目: 0.74 0.51
のようになってしまいます。
最初の値が似たような数値を作ってしまうんです。
どのようにすれば解決するでしょうか。
よろしくお願いいたします。

環境:Windows XP SP2 & Visual C++ 2005 V8.0.50727.42

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void){
  double a,b;
  srand((unsigned int)time(NULL));
  a=(double)(rand()+1.0)/RAND_MAX;
  b=(double)(rand()+1.0)/RAND_MAX;
  printf("%f,%f \n", a,b);
  return 0;
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:傾向のある乱数 28494 yoh2 2006/10/16 03:15:18


No.28494

Re:傾向のある乱数
投稿者---yoh2(2006/10/16 03:15:18)


>最初の値が似たような数値を作ってしまうんです。

>環境:Windows XP SP2 & Visual C++ 2005 V8.0.50727.42

VC++ 2005付属のsrand()、rand()の品質があまり高くないようですね。
具体的な計算式は……晒してもいいかどうか判断できなかったので伏せておきますが、
srand()に指定した値が1違う毎に、srand()直後のrand()の結果が3〜4しか違わないようです。

対応案を二つほど。
その1: time()の戻り値のバイトを入れ替える
連続してプログラムを呼び出すと、time()の差が小さいから似た値になるわけで。
なら、time()の戻りちのバイトを入れ替えてやれば、十分大きな差が得られるのでは?
ただし、別の環境に持っていったり、CRTがバージョンアップしたりで、srand()、
rand()の仕様が変わった場合、この工夫が仇になる可能性も。

その2: 別の乱数生成関数を用意する
有名どころでメルセンヌ・ツイスターとか。
高品質でソースも公開されてますよ。


この投稿にコメントする

削除パスワード

No.28495

Re:傾向のある乱数
投稿者---yoh2(2006/10/16 03:29:47)


>その1: time()の戻り値のバイトを入れ替える

一応効果は確認していますが、半ばネタのような非常にアホな対応策。
この案は見なかったことにしてくれると幸いです。


この投稿にコメントする

削除パスワード

No.28496

Re:傾向のある乱数
投稿者---123456789(2006/10/16 09:04:08)


よく言われますが、CやC++のsrand及びrandはお世辞にも上手い乱数を返しません。
多少精度の高い乱数を必要とするプログラムでは、使い物にならないくいです。

そういう時はフリーの乱数発生器を使うのですが、やはり有名なのはメルセンヌツイスタでしょうか。
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/mt.html
使い方に関してはソースを見れば、大体分かると思います。


この投稿にコメントする

削除パスワード

No.28504

Re:傾向のある乱数
投稿者---VLI2(2006/10/16 22:37:37)


yoh2さん、123456789さん、返信ありがとうございます。
実はVCの乱数はあまり良くないとは聞いていたのですが、
これほどとは思っていませんでした。
しかし、メルセンヌツイスターを用いることで解決できそうです。
ありがとうございました。



この投稿にコメントする

削除パスワード

No.28505

Re:傾向のある乱数
投稿者---Mook(2006/10/17 00:19:03)


標準の乱数は、確かに素性の良いものではないかもしれませんが、
シードのとり方で、ある程度解決できるのではないでしょうか。

すでに、別アルゴリズムを採用する方向のようなので今更ですが、
特に連続してプログラムを実行する場合、シードとして秒単位では
十分ではありません。

http://easter.kuee.kyoto-u.ac.jp/~tsutsui/manual/c.html
にあるように、ミリ秒や、ナノ秒単位の数値を採用することに
簡易的なケースでは十分使用できるかと思います。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧