8

同じ数が連続して 2 回生成されないように、0 から 4 までのランダムな整数を生成するにはどうすればよいですか? たとえば、最初に生成される数値が 3 の場合、2 回目の乱数生成では 0、1、2、4 が可能な数値になります。2 が 2 回目に生成された場合、0、1、3、4 が 3 回目の乱数生成の可能な数になります。

4

4 に答える 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 に答える