同じ数が連続して 2 回生成されないように、0 から 4 までのランダムな整数を生成するにはどうすればよいですか? たとえば、最初に生成される数値が 3 の場合、2 回目の乱数生成では 0、1、2、4 が可能な数値になります。2 が 2 回目に生成された場合、0、1、3、4 が 3 回目の乱数生成の可能な数になります。
2396 次
4 に答える
7
int oldrand = <prior random number>;
int adder = randomNumberGenerator() % 4;
int newrand = (oldrand + adder + 1) % 5;
于 2013-03-31T21:06:04.820 に答える
1
uint32_t myRandomNumber(uint32_t upperBound, uint32_t avoid) {
if (avoid < upperBound) {
--upperBound;
}
uint32_t number = arc4random_uniform(upperBound);
if (number >= avoid) {
++number;
}
return number;
}
初めてこのように呼び出します:
uint32_t number = myRandomNumber(5, 5);
最初の後に次のように呼び出します。
number = myRandomNumber(5, number);
于 2013-03-31T21:17:03.620 に答える
0
Hot Lickの回答を試してみたところ、重複が生成されました(または範囲外の数値)。しかし、それは私にとってうまくいく解決策を思いつくように促しました.
私のコードは C# ですが、必要に応じて変更できます。
//Returns a random number not same as previous random number. ie. no 2 consec random
public static int NonConsecRandom(int max, int? lastNum=null)
{
if (lastNum == null)
return Random.Range(0, max);
int last = (int)lastNum;
return Random.Range(last + 1, last + max) % max;
}
説明:
最初のブロックは、以前に生成された数値がない場合、乱数を返すだけです。
2番目の部分は、「その他の数字」から乱数を生成します。
たとえば、「最大」が 5 の場合、可能な乱数は 0、1、2、3、4 です。
私の最後の数字が2だったとしましょう。今は[3、4、0、1]の乱数が必要です
したがって、last+1 と last+max の間でランダムを生成します。つまり、3 (含む) から 7 (含まない) の間
[3, 4, 5, 6]
これらの数値のいずれかを最大値 (つまり 5) で変更すると、目的の範囲の乱数が得られます: [3 , 4, 0, 1]
于 2017-01-09T05:24:01.200 に答える