2016-04-14 5 views
0

私はメインのファイル内で、コードの私のプログラムでなぜrandはC++で毎回同じ値を生成し続けるのですか?

char a = 97 + rand() % 26; 
char b = 97 + rand() % 26; 
char c = 97 + rand() % 26; 
char d = 97 + rand() % 26; 
char e = 97 + rand() % 26; 
char f = 97 + rand() % 26; 

を持っている、と私は、ファイルを実行したときに私はそれがすべての時間をランダムだろうと想定するたびに、lvqdyoシーケンスを取得します。それが答えであろうとなかろうと、どんな洞察も認められるはずです。

答えて

1

Randomではありません。は本当にランダムです。むしろ、種子に依存する、むしろ擬似ランダムです。

ランダムシードのために、あなたは1は、正確な擬似ランダム系列設定されています。そのため、プログラムを実行するたびに同じ結果が得られるのは、がコンパイルされた後、ランダムシードがに変更されないためです。ランダムのような行動にあなたがそれを実行するたびを持つアプリケーションは、ランダムシードとしての時間情報を使用するので考えるようにするために

#include <cstdlib.h> 
#include <time.h> 

.... 
srand (time(NULL)); //somewhere in the initialization  

time(NULL)は、システム時間にあなたを応じて変化しますランダムシードでありますアプリケーションを実行します。次に、毎回異種種子でrand()を使用することができます:

//somewhere else after initialization 
char a = 97 + rand() % 26; 
char b = 97 + rand() % 26; 
char c = 97 + rand() % 26; 
char d = 97 + rand() % 26; 
char e = 97 + rand() % 26; 
char f = 97 + rand() % 26; 
4

ランダムシードを最初にsrand()を使用して初期化します。 現在の時間が同じことを行うために使用することができます。

#include <cstdlib> // this is where srand() is defined 
#include <ctime> // this is where time() is defined 
srand (time(NULL)); 
char a = 97 + rand() % 26; 
... 

thisを参照してください。

このようなランダムシードにより、その後のすべてのrand()の呼び出しによって乱数が生成されます。あなたが最初にそれをシードする必要がありrand()を使用して

2

、種子が起動されることを確認した例

/* rand example: guess the number */ 
#include <stdio.h>  /* printf, scanf, puts, NULL */ 
#include <stdlib.h>  /* srand, rand */ 
#include <time.h>  /* time */ 

int main() 
{ 
    int iSecret, iGuess; 

    /* initialize random seed: */ 
    srand (time(NULL)); 

    /* generate secret number between 1 and 10: */ 
    iSecret = rand() % 10 + 1; 

    do { 
    printf ("Guess the number (1 to 10): "); 
    scanf ("%d",&iGuess); 
    if (iSecret<iGuess) puts ("The secret number is lower"); 
    else if (iSecret>iGuess) puts ("The secret number is higher"); 
    } while (iSecret!=iGuess); 

    puts ("Congratulations!"); 
    return 0; 
} 

srand(time(NULL))下記参照のでrand缶が

正しく読み取るソースに動作します CPP - Rand()

関連する問題