非连续重复的整数数组

时间:2019-11-21 03:20:24

标签: c# arrays random

我正在尝试生成一个非连续重复的整数数组。到目前为止,我所能做的很好,除了偶尔会生成一组双0。我的问题是:

  1. 我该如何阻止
  2. 必须有更好的方法来做到这一点?这很丑。

我非常感谢您可以分享的任何见解。

这是代码:

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

2 个答案:

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

当然,您将生成比所需更多的随机数,但性能损失不会很大。