2016-11-22 22 views
4

私はこのトピックが以前からカバーされていたと知っていますが、まだ少し混乱しています。私はCの新しいブランドですので、私と一緒に裸をしてください。私はPythonを知っているし、設定された間隔で乱数を作成するのはとても簡単ですが、Cでは少し複雑です。スタックオーバーフローに関する他の質問を見ることで私が持っていることはここにあります。Cで設定した間隔で乱数を生成する

int diceroll_1; 
diceroll_1=(rand()%3)+1; 
printf("%d\n",diceroll_1); 

問題は毎回私に3を与えることです。私はプログラムがコンパイルされて実行されるたびに異なったものにしたい。私はそれが1から3のランダムであることを望む。私の理解は、これがそれを救うかもしれないということであり、それが毎回3を生み出していて、私が望むものではないからです。同じ番号ではなく、毎回乱数を生成するにはどうすればよいですか?

+1

皮肉にも同じシードを持つランドは常に同じ結果を与える - 数はランダムですが、デバッグのために同じ(vが便利)。なぜなら、毎回違うものをそれに植えなければならないからです。 – pm100

+0

[Cで乱数を生成する]の複製があります(http://stackoverflow.com/questions/3067364/generating-random-numbers-in-c) –

+0

@RandomDavisいいえ、私はSeanがそれを読んだが、 。 – Blacksilver

答えて

3

シードsrandでしたか?ない場合は、次のように試してみてください。

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

int main(void) 
{ 
    srand(time(NULL)); // only once 

    // roll the dice 
    int diceroll_1; 
    diceroll_1=(rand()%3)+1; 
    printf("%d\n",diceroll_1); 

    return 0; 
} 

出力:

Georgioss-MacBook-Pro:~ gsamaras$ gcc -Wall main.c 
Georgioss-MacBook-Pro:~ gsamaras$ ./a.out 
3 
Georgioss-MacBook-Pro:~ gsamaras$ ./a.out 
1 

PS:

rand()が私たちの教授として、擬似乱数を生成します。 IPで主張した!何のシード値が提供されていない

場合は、ランド()関数は自動的に値を播種 です:それはrefから我々がいることを持っているので、それ以外の場合は、何度も何度も同じ番号を与える、シードさにする必要があります

+0

正しい。 'time()'は現在のunixtimeを返します。さらに、 'int * p;のようなポインタを渡すと変数に格納されます。時間(p); ' – Blacksilver

+0

ありがとう@ブラックシルバー..私は同意する! – gsamaras

+0

私はあなたのポストを編集しようとしていました。実際には、「ダイスをロールしてください」を実際のダイスローリングコードに置き換えました。忍者! – Blacksilver

0

機能は、生成された前の乱数を取り込み、その上で何らかの並べ替えを実行し、それを返して機能します。最初にrandを呼び出すのであれば、乱数生成シーケンスのシードの値を取り、それを置換します。

コンピュータは基本的に確定的なマシンであり、TRNGsのような新しいデバイスのないハードウェア/ CPU命令レベルでは「ランダム性」は実際には存在しません。

Pythonのような高水準言語はこれを隠し、自動的にシステム時間に乱数生成を引き継ぐことがありますが、C言語ではそれができません。 randを呼び出す前に、シード値でsrandに電話する必要があります。今

srand(3);srand(100);などの引数を持つsrandが互いに異なる乱数を生成します呼び出し、彼らは毎回同じ順序になります。あなたはシードのためのユニークな値をしたい場合は、現在のシステム時刻を使用してみてください:

srand((unsigned)time(NULL));

+0

なぜ、それがなぜPythonほどシンプルではないか分かりました。 –

関連する問題