No.3ベストアンサー
- 回答日時:
>きわめて近い値になるんじゃないんですか?
まったく同じ値になるんじゃないですか?
理由は(unsigned)time(NULL)が両方とも同じ、つまり
ランダムシードが同じ値で、その10番目なので同じ数値になっているのです。
2番目のランダムシードをsrand((unsigned)time(NULL)+1);とすればまた全く違う値になるでしょう。
これはrandの精度の問題ではありません。
#include <stdlib.h>
#include <stdio.h>
int main()
{
int i,r1,r2;
r1=r2=0;
srand((unsigned)time(NULL));
for(i=0;i<10;i++)r1 = rand();
printf("%d\n",r1);
srand((unsigned)time(NULL)+1);
for(i=0;i<10;i++)r2 = rand();
printf("%d\n",r2);
return 0;
}
実行結果
1回目
25389
3267
2回目
779
11425
3回目
11425
22072
ちなみにrand自体は0からRAND_MAX(VCだと32767)の値までしか返しませんから、その範囲以外の値にしたいのなら
例えばrand() * (RAND_MAX+1) + rand()等の工夫が必要になります。
ただ乱数の精度を要求するにはrandで不足する場合ももちろんあります。
より厳密な乱数を使いたいなら、ネットを上に乱数生成のソース
が転がっています。
boost等にもrandより精度の高い乱数生成の機能が用意されています。
No.5
- 回答日時:
srandやsrandomで初期化をきちんとしていたのなら
それも書いていただけると良かったのですが。
順を追っていくと、MTにしても丸っきりの乱数を生成するものではない
(ただし線形合同法などに比べれると格段に質よい擬似乱数が得られる)です。
ですので、ごく短時間に時間を種にするということをやるのなら
MTを使っても同じ結果になるだけだと思います。
まず一つ目の質問として、擬似乱数の系列を変える必要はあるのでしょうか?
もちろん簡単にした例だとは思いますが、#1の補足にある
ものをみると、別に系列を新たにしなくてもいいような気がします。
もしどうしても複数の系列で行いたいというのであれば、
ごく短時間でもデータが変わるものを種にしてはどうでしょうか。
UNIXなら /dev/random を読むとかできますが、デバッグのことを考えると、たとえば
一段めとして時間で初期化して、適当に二個数値を取り出して、
それぞれを新たな乱数列の種に使うとか。
cmd.exeのコマンドラインなら %RANDOM% で 0~32767の乱数が得られるのですが
これをプログラムからでは取るの画面度でしょう。
二つ目の質問ですが、MTを使おうとしてヘッダーファイルを
ダウンロードしたとありますが、具体的にどのサイトの
どのファイルでしょうか?
わたしが検索したところ、1番目に引っかかったところにあったのは
Cでのソースとドキュメントと出力例のもので
ヘッダーファイルはなかったのですが?
No.1
- 回答日時:
メルセンヌ・ツイスタのことはよく知らないのですが、
srandom関数で初期値を変えたりしましたか?
使っていないのであれば、乱数を生成するための初期値は毎起動時に一定なので、
何回起動しても、同じ乱数が同じように生成されます。
一般的には、
srandom((unsigned)time(NULL));
などをrandom関数を使う前に一度記述して、毎回違う乱数を生成するようにします。
この回答への補足
でもその記述方法で記述すると短い間隔で呼び出したときに
きわめて近い値しかかえってこない気がするのですが
たとえば
int i,r1,r2;
r1=r2=0;
srandom((unsigned)time(NULL));
for(i=0;i<100;i++)r = rand();
printf("%d",r);
srandom((unsigned)time(NULL));
for(i=0;i<100;i++)r = rand();
printf("%d",r);
(前後略)
という構文したとして
このときのr1とr2の値は
きわめて近い値になるんじゃないんですか?
質問ばかりですいません
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラム内から、MIDIファイルの一部分だけを再生する方法 1 2023/02/15 11:08
- 数学 メルセンヌ素数探しについて。 2 2022/06/07 22:42
- 工学 疑似乱数生成器 3 2023/01/05 02:06
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
- 数学 コラッツテーブルがコラッツ予想を証明していることを説明 11 2022/06/17 03:50
- Excel(エクセル) ExcelのIF関数について 4 2023/05/24 12:54
- 数学 コラッツ数値群テーブルがコラッツ予想を証明していることを説明 9 2022/06/19 17:38
- C言語・C++・C# 参考にいろいろとc言語、c++言語プログラミングでレジストリーを操作したいのですが、無料配布のc++ 3 2022/12/22 01:49
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- Excel(エクセル) EXCELの「接続」のSQLのコマンド文字列にて、セルから任意の数値を利用したい 2 2023/03/09 16:43
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語 exitの使い方
-
フォームを開くときに、コンボ...
-
Excel-vba 文字列と変数を...
-
VB6.0-整数と余りを求める
-
10進数をアスキーコードに変換
-
ラジオボタンの値の取得につい...
-
DataGridView 複数行同時変更...
-
Rubyで1ミリ秒のsleepできない...
-
Access2003 オートナンバーの現...
-
大きな数の乱数を作るには
-
VBAのチェックボックス結果を集...
-
C#でのIF文 時間比較のやり方
-
足して100になるような乱数のア...
-
C言語(DXlib)での音ゲーについ...
-
C言語でCLAMP(a,b,c)
-
VBAで配列のNULL判定
-
VBで余りを求める
-
相関係数p値の出し方
-
負の二進数
-
VBAで72時間タイマーがオーバー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
フォームを開くときに、コンボ...
-
足して100になるような乱数のア...
-
Excel-vba 文字列と変数を...
-
C言語 exitの使い方
-
VB6.0-整数と余りを求める
-
VBAで配列のNULL判定
-
数字の位ごとの値を表示するプ...
-
VBAの定数の使い方で、計算値を...
-
フリーランタイマーの時間差分...
-
C#で動的にコントロールを取得...
-
10進数をアスキーコードに変換
-
コンボボックスの名前を変数に...
-
1つ前の値を変数に保存する方法
-
ラジオボタンの値の取得につい...
-
スピンボタンで小数点
-
相関係数p値の出し方
-
C言語でCLAMP(a,b,c)
-
DataGridView 複数行同時変更...
-
VBAのチェックボックス結果を集...
-
データ構造のmapとは?
おすすめ情報