随机数不能连续重复相同的值

时间:2017-03-08 16:50:26

标签: c# random

我有以下随机数:

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()。问题不在于游戏对象,这很好用。我只是不希望连续两个数字相同。

4 个答案:

答案 0 :(得分: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 :(得分:1)

+1之后的rnd.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;
}

答案 2 :(得分: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();

        }
    }

答案 3 :(得分:0)

在rnd.next上不需要循环来避免这个问题:在初始随机(1,4)之后,在val = random(1,3)上循环,并在val> = oldval时将val加1。

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