2013-03-31 19 views
7

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

+0

ランダムな乱数を少なくすることはできません。一意にするにはNSSetを使用します。 – CodaFi

+0

[指定された番号から乱数を生成]の可能な複製(http://stackoverflow.com/questions/15680582/generate-random-number-from-given-number) –

+0

も参照してくださいhttp://stackoverflow.com/a/ 56656/1187415。 –

答えて

5
int oldrand = <prior random number>; 
int adder = randomNumberGenerator() % 4; 
int newrand = (oldrand + adder + 1) % 5; 
+0

私はこのソリューションのしくみを理解していません。あなたがさらに説明するなら、私はそれを感謝します。 – oopology

+1

@oopology - あなたは番号0を持っています。4.同じ範囲内に別の番号が必要です。正確に同じ番号ではありません。最初の数字に1から4の間の任意の数字を追加し、追加がオーバーフローした場合は、「包み込む」。したがって、最初の数字が3で、ランダムな値2を選択して3 + 2 + 1を追加すると、6より大きくなり、範囲よりも大きくなります。しかし、5は0に、6は1にラップするので、結果は1です。説明のために –

+0

ありがとうございます。私はあなたの説明を与え、投票に答えるのに十分な票を持っていたらいいのに。 – oopology

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; 
} 

このように最初にそれを呼び出す:

number = myRandomNumber(5, number); 
0

それは2つの配列を用いて生成することができ;

uint32_t number = myRandomNumber(5, 5); 

は、最初の時間の後、このようにそれを呼び出します

-(NSMutableArray *)generateRandomNumbersFrom:(int) a to:(int)b 
{ 

    NSMutableArray * numbersWillBeChosen=[NSMutableArray new]; 
    NSMutableArray * randomList=[NSMutableArray new]; 
    //add the numbers that will create your ramdom list in order 
    for(int k=0;k<=(b-a);k++) 
    { 
     [numbersWillBeChosen addObject:@(a+k)]; 
    } 


    //create random list 
    for (int p=(b-a)+1; p>0; p--) { 

     int rand= arc4random()%p; 

     [randomList addObject:[numbersWillBeChosen objectAtIndex:rand]]; 

     [numbersWillBeChosen removeObjectAtIndex:rand]; 


    } 

    NSLog(@"%@",randomList); 

return randomList; 
    } 

のように分類され、あなたがあなたの状況

randList=[self generateRandomNumbersFrom:0 to:4]; 
0

のために呼び出すことができます(私はホットリックの答えをしようと、それは私のために重複を生成することになったフォーム1がソートされ、他方はランダムなオブジェクトを取ることによって作成されますまたは範囲外の番号)。しかし、それは私のために働く解決策を考え出すよう促しました。

私のコードは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]

Modの間の最大とこれらの数字のいずれか(すなわち5)とあなたがランダムな番号を取得します希望の範囲:[3、4、0、1]