2017-03-08 86 views
0

我有以下的随机数创:随机数连续不重复相同的值

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

我已经看过该网站上类似的问题,我相信+1是为了防止获得相同数量的连续。

我想序列是随机的,但我不希望连续两次相同的值。例如:

1,1,2,2,3,4会错,但1,2,1,2,3,4,3会满足我的需求。

我尝试以下,但它并没有解决我的问题:

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

注意,通过统一的物体碰撞产生的每个数字后numLogic()调用成功。问题不在游戏对象,这工作正常。我只是不希望连续两个数字相同。

+1

+1所做的唯一的事情是让你的范围2-4而不是1-3。 –

回答

1
int val; 
int oldval = val; 

这套oldval = 0;

您将需要保存您的VAL功能外

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

+1rnd.Next(1,4)是没有必要的。只需更改为rnd.Next(2,5)即可实现相同效果。 (但我想你不想要这个?)

你的问题功能是:你只生成一个数字。 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不会阻止连续获取相同的数字。 这是防止得到零(通过移动范围一)。

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

没有必要对rnd.next一个循环来避免该问题:后初始随机(1,4),环上VAL =随机(1,3),并添加1〜VAL 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) ;