2017-03-08 12 views
0

私は、次の乱数GEN持っている:私は、サイト上で同様の質問を見てきました乱数列に同じ値を繰り返していない

val = rnd.Next(1, 4)+1; 

を、私は1と同じ番号を取得して防ぐことを意図していると考えています一列に

シーケンスをランダムにしたいが、同じ値を2回続けてもらいたくない。たとえば:

1,1,2,2,3,4が間違っているかもしれませんが、1,2,1,2,3,4,3が私のニーズを満たすでしょう。

私は次のことを試してみましたが、それは私の問題を解決しない:各番号が統一のオブジェクトの衝突によって生成された後numLogic()が正常に呼び出されていること

void numLogic() 
{ 
    System.Random rnd = new System.Random(); 
    int val; 
    int oldval = val; 
    val = rnd.Next(1, 4)+1; 
    while (oldval == val) 
    { 
    val = rnd.Next(1, 4) + 1; 
    } 
} 

注意を。問題はゲームオブジェクトではない、これは正常に動作します。私はちょうど2つの数字が同じになることを望んでいません。

+1

+1は、1-3の代わりに範囲を2-4にします。 –

答えて

1
int val; 
int oldval = val; 

これは、oldval = 0を設定します。あなたはrnd.Next(1,4)+1

static int lastVal; 
void numLogic() 
{ 
    var val = rnd.Next(1, 4)+1; 
    while (lastVal== val) 
     { 
      val = rnd.Next(1, 4) + 1; 
     } 
     lastval = val; 
} 
+1

少し古いですが、これは 'do ... while'ユースケースの完全な例です。 – Forklift

1

関数の外あなたのvalを保存する必要があります

は全く必要ありません。同じように実現するには、rnd.Next(2,5)の境界に変更してください。 (しかし、私はあなたがこれを望んでいないと思いますか?)

あなたの問題は、1つの数字だけを生成することです。 oldvalは関数外の変数で、最後の関数呼び出しの値を格納する必要があります。次のようなものがあります。

int oldrnd = 0; 
int nextRandom() { 
    int val = rnd.Next(1,4); 
    while(oldrnd == val) val = rnd.Next(1,4); 
    oldrnd = val; 
    return val; 
} 
0

+1は、同じ番号を連続して取得しないようにしてはいけません。 0を得ることができません(範囲を1つシフトすることによって)。この問題を回避するためにrnd.next上のループの必要はありません

using System; 
class Program 
    { 
     static void numLogic() 
    { 
     int val; 
     int oldval ;//= val; 
     Random rnd = new Random(); 
     val = rnd.Next(1, 4)+1; 
     oldval=val; 
     int numberOfNumbers = 7; 
     int i=0; 
     while (i<numberOfNumbers) 
      { 
       val = rnd.Next(1, 4) + 1; 
       if(oldval==val)continue; 
       oldval=val; 
       Console.Write("{0} ",val); 
       i++; 
      } 
    } 
     static void Main(string[] args) 
     { 
      numLogic(); 

     } 
    } 
0

:ヴァルのループ=ランダム(1,3)とvalに1を追加します(1,4)初期ランダム後にするときのval> = oldval。

System.Random rnd = new System.Random(); 
List<int> nums = new List<int>() ; 
int ListCount = 10 ; // expected length of the sequence 
int val = rnd.Next(1, 4)+1; 
nums.Add(val)   
for (int i=1;i<ListCount;i++) 
    nums.Add((val=rnd.Next(1,3)+1)<nums[i-1] ? val : val+1) ; 
関連する問題