2012-03-22 5 views
3

rand()%(range)を使って乱数を生成しようとしています。 は、ここに私のコードが設定され方法は次のとおりです。rand()を使って乱数を生成する

srand(time(NULL)); 
someClass *obj = new someClass(rand()%range1,rand()%range2... etc); // i.e. a number of random numbers one after the other 

私はこれを実行するたびに、それは同じ番号を生成)(ランドへのすべての呼び出しようです。私はせずにそれをやってみました:(編集:すべてのrand()が最後に編集を読んで、それはそうと同じ番号を生成しません)

srand(time(NULL)); 

、その後、プログラムの実行ごとに同じ結果が得られます。

また、rand()へのすべての呼び出しはコンストラクタ内にあるので、私は本当にそれを常に再シードします。私は事前にコンストラクタに送信されたすべてのオブジェクトを作成し、その間に乱数ジェネレータを再配置することができると思いますが、それは控えめな解決策のようです。

さまざまな乱数を生成するにはどうすればよいですか?

編集:これはループ内でたくさんのオブジェクトを作成していたためです。ループが繰り返されるたびにsrand(time(NULL))が再シードされ、シーケンスがリセットされました(時間(NULL)それで、それ以降のすべてのオブジェクトは非常に似た性質を持っています。

+1

がrandom_r http://www.ellipsix.net/blog/2009/3/how-to-use-random-r.htmlを使用してみてくださいかなりうまく動作状況、たとえばです。そうすれば、一度シードすることができます。 – Mikhail

+0

乱数ジェネレータは最初に播種する必要があります。もっとコードを投稿できますか?あなたは 'rand()%range1 = rand()%range2 = ... = rang()%rangen'と言っているようですが、そうではありません。 'range1'とは何ですか? – MGwynne

答えて

6

あなたは一度srandを呼び出した場合、その後、後続のすべてのrandの呼び出しは、(別の)擬似乱数を返します。もしそうでなければ、それは間違っているのです。 :)

これ以外には、randはかなり役に立たない。 Boost.Random(またはC++ 11標準ライブラリ<random>ヘッダー)は、単一のグローバルシードを使用するrandとは異なり、より強力でより現代的なインターフェイスを備えた、より強力な乱数ジェネレータを提供します)で

+0

"randはかなり役に立たない"と私は同意するでしょうか?品質は変わりますし、品質の乱数ジェネレータを必要とするアプリケーションは他の場所で見る必要がありますが、 'rand'はちょうど遊んだり実験したりするのに十分です。 –

+1

もっと良い選択肢があるときは、 'rand'を使うのはかなり難しいと主張したいと思います。定義によると、それは無用になります。 :) – jalf

+0

あなたはほとんどすべてのことについて、それを言うことができます。より良い選択肢はありますが、一般的にはそれらを見つけてインストールするための余分な努力を意味します。実際の作業に乱数を使用している場合は、そうするでしょう。ただ遊びに行くだけで、必要はありません。実際の作業でも、移植性が問題ではなく、あなたのプラットフォームでの 'rand()'の実装が十分であれば、別の解決策を探す必要はありません。 –

2

異なる開始点を付け直さない限り、rand()は常に同じシーケンスを返します。それは実際にはプログラムテストを繰り返し行うことができる機能です!

したがって、にはを呼び出すためにがあります。おそらく、最初のコンストラクタを呼び出す前にそれを行うことができますか?

1

チェックこのコード:これは異なる乱数を生成http://ideone.com/xV0R3#view_edit_box

#include<iostream> 
#include <stdio.h> 
#include <stdlib.h> 
#include<time.h> 

using namespace std; 
int main() 
{ 
int i=0; 
srand(time(NULL)); 
while(i<10) 
{ 
cout<<rand()<<endl; 
i++; 
} 
return 0; 
} 

srand()に一度だけ電話する必要があります。 srand()コールのたびにrand()が異なる番号を生成します

+1

*いいえ*。ただプレーン* no *。 'srand'を2回以上呼び出すことは、テストの外ではほとんど役に立ちません。 –

+0

一度だけ呼び出す必要はありませんか? – Mikhail

+0

申し訳ありません。私はそれを修正しました。 –

2

プログラムの開始時にsrandを一度呼び出します。乱数が必要なときは、いつでもrand()%rangeを呼び出します。ここで

#include <iostream> 
#include <stdlib.h> 
#include <time.h> 

using namespace std; 

class Test 
{ 
    public: 
    Test(int num0,int num1, int num2):num0_(num0),num1_(num1),num2_(num2){} 
    int num0_,num1_,num2_; 
}; 

int main() 
{ 
    srand(time(NULL)); 
    Test *test=new Test(rand()%100,rand()%100,rand()%100); 
    cout << test->num0_ << "\n"; 
    cout << test->num1_ << "\n"; 
    cout << test->num2_ << "\n"; 
    delete test; 
    return 0; 
} 
関連する問題