我正在尝试生成一个非连续重复的整数数组。到目前为止,我所能做的很好,除了偶尔会生成一组双0。我的问题是:
我非常感谢您可以分享的任何见解。
这是代码:
int[] randInts = new int[20];
Random rand = new Random();
for (int i = 0; i < 20; i++)
{
randInts[i] = rand.Next(0, 8);
}
for (int i = 1; i < 20; i++)
{
if (randInts[i] == randInts[i - 1] && randInts[i] < 8 && randInts[i] > 0)
{
randInts[i]--;
}
else if (randInts[i] == randInts[i - 1] && randInts[i] > 0)
{
randInts[i]++;
}
}
答案 0 :(得分:2)
public IEnumerable<int> NonConsecutiveRepeatingRandomValues(int upperBound)
{
Random rand = new Random();
int prev = -1;
while(true)
{
int value = prev;
while (value == prev)
value = rand.Next(upperBound);
yield return value;
}
}
然后要精确获取20个值(而不是永远循环),请像这样调用它:
var randInts = NonConsecutiveRepeatingRandomValues(8).Take(20).ToArray();
但是只有在确实需要数组时,才使用ToArray()
调用。您会惊讶地发现,没有它,您经常能渡过难关。
答案 1 :(得分:1)
当您输入与上次相同的数字时,又重新滚动一次又如何呢?
int[] randInts = new int[20];
Random rand = new Random();
int lastVal = -1;
int val = -1;
for (int i = 0; i < 20; i++)
{
while (val == lastVal)
val = rand.Next(0, 8);
randInts[i] = val;
lastVal = val;
}
当然,您将生成比所需更多的随机数,但性能损失不会很大。