web-dev-qa-db-ja.com

cで1から10の間の乱数を生成します

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

int main()

{
    int randomnumber;
    randomnumber = Rand() % 10;
    printf("%d\n", randomnumber);
    return 0;
}

これは、randomnumberが1から10の間の乱数として出力されることを意図した初期化されていないint変数である単純なプログラムです。しかし、繰り返し実行するたびに常に同じ数値を出力します。誰かが助けて、なぜこれが起こっているのか教えてもらえますか?ありがとうございました。

13
Nisarg

実行ごとに異なるシードが必要です。

プログラムの開始時に呼び出しを開始できます。

srand(time(NULL));

% 100から9へではなく1から10への結果を生成することに注意してください:1%に追加するだけです1から10を取得する式。

13
ouah
srand(time(NULL));

int nRandonNumber = Rand()%((nMax+1)-nMin) + nMin;
printf("%d\n",nRandonNumber);
1
Byusa

man 3 Randから乱数ジェネレーターをシードする必要があります

シード値が指定されていない場合、Rand()関数には値1が自動的にシードされます。

そして

Srand()関数は、Rand()によって返される擬似乱数整数の新しいシーケンスのシードとして引数を設定します。これらのシーケンスは、同じシード値でsrand()を呼び出すことで繰り返し可能です。

例えば.

srand(time(NULL));
1
Macattack

プログラムで単一の乱数を生成することは問題です。乱数生成器は、繰り返し呼び出しが与えられた確率分布から数を生成するという意味で「ランダム」です。

RNGのシードは、特に低解像度タイマーからシードするだけの場合は役に立ちません。時間のハッシュ関数である数値を取得するだけで、プログラムを頻繁に呼び出す場合、頻繁に変更されることはありません。 srand(time(NULL) + getpid())(Windowsでは_getpid())を使用すると少し改善されるかもしれませんが、それでもランダムではありません。

ランダムな数を取得する唯一の方法は、プログラムの複数の呼び出しacrossをプログラムの外部から取得することです。これは、_/dev/random_(Linux)やCryptGenRandom()(Windows)などのシステムサービス、または_random.org_などのサービスを使用することを意味します。

0

このサイトから取得したcを使用して、乱数ジェネレーターのソースコードを実行する準備ができています。 http://www.random-number.com/random-number-c/ ここでの実装はより一般的です(3つのパラメーターを取得する関数:生成する乱数の最小、最大、および数)

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

// the random function
void RandomNumberGenerator(const int nMin, const int nMax, const int  nNumOfNumsToGenerate)
{
  int nRandonNumber = 0;
  for (int i = 0; i < nNumOfNumsToGenerate; i++)
  {
    nRandonNumber = Rand()%(nMax-nMin) + nMin;
    printf("%d ", nRandonNumber);
  }
  printf("\n");
}

void main()
{
  srand(time(NULL));
  RandomNumberGenerator(1,70,5);
}
0
dang