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