2011-11-29 23 views
7

このCコードを書きましたが、ループすると乱数が返されます。 myrand()が実行された場合、どのように5つの異なる乱数値を得ることができますか?関数のループで乱数が返されない場合は、

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

int myrand() { 
    int ue_imsi; 
    int seed = time(NULL); 
    srand(seed); 
    ue_imsi = rand(); 

    return ue_imsi; 
} 

int main() 
{ 
    int value = 0; 
    int i=0; 
    for (i=0; i< 5; i++) 
    { 
     value =myrand(); 
     printf("value is %d\n", value); 
    } 
} 
+8

シード**一度**あなたの人生ではなく、すべての時間。 –

+0

乱数ジェネレータを同じ番号で何​​度も何度も初期化しています( 'time(NULL)'が同じ値を返す限り)。数字をランダムに見せたいと思っているなら、それをしないでください。また、 'time()'プロトタイプのために '#include 'を覚えておいてください。 – pmg

+1

[常にrand()によって与えられた繰り返し数]の複製が可能です(http://stackoverflow.com/questions/4859089/always-repeated-numbers-given-by-rand)。ご質問の前に、SOの検索施設をご利用ください。 –

答えて

19

をあなたが生成する乱数の各シーケンスのために(一度行われるべきである発電機を播種コース):!

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

int main() 
{ 
    int seed = time(NULL); 
    srand(seed); 
    int value = 0; 
    int i=0; 
    for (i=0; i< 5; i++) 
    { 
     value =rand(); 
     printf("value is %d\n", value); 
    } 
} 
+0

rand()はおそらく低周期なので、私はsrandを時間から時間に呼び出すことになります(大きなループの場合) –

4
ループの前に、 main()srand()コールを移動し

。言い換えれば

srand()に任意のさらなる呼び出しせずに、一度 srand()を呼び出した後、繰り返し rand()を呼び出します。

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

int main() 
{ 
    int value = 0; 
    int i = 0; 
    srand(time(NULL)); 
    for (i = 0; i < 5; i++) 
    { 
     value = rand(); 
     printf("value is %d\n", value); 
    } 
} 
+0

errr。ええ、それは動作します。しかし、なぜ? – xambo

+2

@xambo: 'time()'をすばやく連続して数回呼び出すと、クロックがチェックされていないので、同じ値を返す可能性があります。同じシードで 'srand()'を呼び出すと、 'rand()'の次の呼び出しは同じ値を返します。私が言ったように、あなたはランダムな値が必要なたびにジェネレータを再初期化しようとしないでください。 – NPE

0

シードのポイントは、()あなたは、常に
でしょう、既知の値で乱数列を開始することです同一のシードが与えられた同じ一連の数字。

あなたはシードを(持っている理由です)、それの両方が毎回

2

はこの試してみてください、あなたが異なる配列を取得しますが、テストのために、同じシーケンスを生成することができ、またはランダムシード(通常時)与えられた:

#include <stdio.h> 
#include <time.h> 
int main(void) { 
    for (int i = 0; i < 10; i++) { 
     printf("%ld\n", (long)time(NULL)); 
    } 
} 

私のあなたがrandom()を呼び出すたびに、ここにあなたが股関節を行うことが一つの方法だ10の等しい値が印刷されるということです:)

+0

これは答えではありません。 (_しかし、問題の一部をOP_に説明しています) – JeromeJ

-1

あなたは(余分ランダム性のために)再シードしたい場合は「推測」 T:毎秒一回

srandom(time(0)+clock()+random()); 
  • time()の更新ができますが、はるかに頻繁にあなたのプログラム
  • clock()アップデートを実行されますが、0で、あなたのプログラム
  • random()を実行するたびに起動するたびに異なりますループが粒度よりも速い場合は、同じ値を2回続けて再シードしないようにします(clock()

もちろん、あなたが本当に、本当に、ランダム性を望むなら、あなたはもっと多くのことをすることができますが、これは始まりです。

+0

あなたのプログラムにI/O遅延がない場合、おおまかに決定的なので、 'clock()'を使って、ここで大きな価値を追加することはありません。 – nobar

+0

何とか一貫して0が得られない限り、クロックは少なくともエントロピーの余分なビットを追加するので重要です。 – this

+0

http://scruss.com/blog/2008/10/12/pgmrnoise-a-more-random-or-less-repeatable-pgmnoise/ – nobar

関連する問題