3

srand と rand を使用して -1、0、または 1 をランダムに生成する方法を見つけようとしています。ただし、いつでも、生成された範囲内の値しか取得できず、-1 または 1 は取得できません。

これは私が試したものです:

   int value;
   srand(time(NULL));
   value=2*rand()/(RAND_MAX)-1;

ただ、実行すると必ず0を生成します。たまに-1と1を生成できるようにしたいです。問題は、仕様の一部として、rand と srand を使用する必要があることです。どんな助けでも大歓迎です、そして前もって感謝します:)。

4

3 に答える 3

8

どうですか

value = (rand() % 3) - 1;

この式は~rand() % 3の間の乱数を生成し、次に 1 を引いて ~ の間(両端を含む) にします。02-11

于 2013-03-03T20:17:39.920 に答える
2

まず、3 つの異なる値が必要ですが、2 しか要求していません。次に、一部の実装 (および明らかに使用している実装) では、RAND_MAX == INT_MAX であるため、計算がオーバーフローする可能性があります。浮動小数点を使用してこれに対処できます

// srand(time(NULL)); Only do this once per invocation of your program
int value = (int)(3.0*rand()/RAND_MAX) - 1;

またはロングロング

int value = 3LL*rand()/RAND_MAX - 1;

または、因子を除数に移動します。

int value = rand()/(RAND_MAX/3) - 1;

編集: RAND_MAX は 3 の倍数ではないため、これらはわずかに歪んだ (RAND_MAX が少ないか多いほど) 結果を生成することに注意してください。これは次の方法で回避できます。

int r;
do
{
    r = rand();
} while (r >= RAND_MAX/3 * 3);
int value = r / (RAND_MAX/3) - 1;
于 2013-03-03T21:08:41.517 に答える
0

コードに off-by-one エラーがあり、整数オーバーフローが発生する可能性があります。

変化する

value = 2 * rand() / RAND_MAX - 1;

value = rand() / (RAND_MAX / 3 + 1) - 1;
于 2013-03-03T20:22:05.503 に答える