0

0 から 1000000 までの乱数を生成するにはどうすればよいですか?

以下のコードは既に試しましたが、それでも 0 から 32767 (RAND_MAX) までの数値が得られます。

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

int main(){
    int i,x;
    srand(time(NULL));
    for(i=0; i<10000; i++){
        int x = rand() % 10000000 + 1;
        printf("%d\n",x);
    }
    return 0;
}
4

3 に答える 3

5

[編集] 最初の答えは 0 から 1,000,000 まででした。これで、0 から 10,000,000 になるはずです。

rand()少なくとも 15 ビットの回答が得られるように、複数回呼び出し、15 ずつシフトrand()し、結果を XOR します。最後に 10,000,001 で変更します。

unsigned long x;
x = rand();
x <<= 15;
x ^= rand();
x %= 10000001;

分布は非常に平坦ですが、非常に小さな偏りがあります。32768*32768 回の反復の後、x0 から 10,000,000の各値が107.37 回発生します。代わりに、それらは 107 ~ 108 回の範囲です。

rand()複数の呼び出し結果を+,*またはと組み合わせる|と、結果の分布に大きな偏りが生じます。

[編集]

RAND_MAXOP のプラットフォームでは 32767 (0x7FFF) です。C 仕様では、「RAND_MAX マクロの値は少なくとも 32767 でなければならない」と書かれています。RAND_MAXは15 ビットより長い可能性があるため、他のプラットフォームで使用する場合は、このコード^ではなく上記の演算子を使用することが重要です。|

于 2013-11-09T04:55:49.487 に答える
2

% 10000010 から 1000000 の間の数値が必要な場合は、で計算します。またRAND_MAX、少なくとも 32767 であることが保証されています。

int main(){
  int i, x;
  srand(time(NULL));
  for(i=0; i<10000; i++){
    x = (rand() * rand()) % 1000001;
    printf("%d\n",x);
  }
  return 0;
}
于 2013-11-08T23:24:10.890 に答える