0
int main() 
{ 
  srand((unsigned)time(0)); 
  int random_integer; 
  int lowest=0, highest=10; 
  int range=(highest-lowest)+1; 
  for(int index=0; index<20; index++){ 
    random_integer = (rand() % range) + lowest/(RAND_MAX + 1.0);
    cout << random_integer << endl; 
  } 
} 

0 から 10 までの 11 個の数字を出力していますが、10 番は取得したくありません。0 から 9 だけです。つまり、10 個の乱数です。どうすればよいですか?

4

5 に答える 5

3

モジュロ演算は、数値のx % c;除算の余りを。で返します。その場合、可能な戻り値があります。xcx % 10100 1 2 3 4 5 6 7 8 9

rand()withを使用して乱数を%生成すると、結果が歪んでしまい、それらの数値が均一に分散されないことに注意してください。minこれは、からまでの区間から乱数を生成する単純なCスタイルの関数ですmax

int irand(int min, int max) {
    return ((double)rand() / ((double)RAND_MAX + 1.0)) * (max - min + 1) + min;
}

この関数によって生成された数値は均一に分散されていることに注意してください。

int occurences[8] = {0};

srand(time(0));
for (int i = 0; i < 100000; ++i)
    ++occurences[irand(1,7)];

for (int i = 1; i <= 7; ++i)
    cout << occurences[i] << ' ';

出力:14253 14481 14210 14029 14289 14503 14235

また、見てください:
範囲内で乱数を生成しますか?
範囲全体で均一に乱数
を生成するC++で乱数を生成するための最良の方法は何ですか?

于 2012-03-01T11:49:35.497 に答える
0

完全に理解してから、この行を変更する必要があるようです

random_integer = (rand() % range) + lowest/(RAND_MAX + 1.0);
于 2012-03-01T11:48:22.273 に答える
0

rand() % 10通常、私のためにトリックを行います..(私が何かを逃していない限り)

于 2012-03-01T11:48:28.197 に答える
0

このタイプの質問にはn回回答されています。

これを見てください

于 2012-03-01T12:00:05.457 に答える
0
int main() 
{ 
  srand((unsigned)time(0)); 
  int random_integer; 
  int lowest=0, highest=9; 
  int range=(highest-lowest)+1; 
  for(int index=0; index<20; index++){ 
    random_integer = (rand() % range) + lowest;
    cout << random_integer << endl; 
  } 
} 
于 2012-03-01T11:59:49.093 に答える