如何在Windows Phone应用程序中生成没有重复的随机数



这是生成随机数的代码,但是我得到了重复的数字,我该如何克服这个问题。

    void getnumbers()
    {
        Random r = new Random();
        int[] trubyte = new int[4];
        for (var x = 0; x < 4; ++x)
        {
            trubyte[x] = r.Next(1, 5);
        }
        b1.Content = trubyte[0];
        b2.Content = trubyte[1];
        b3.Content = trubyte[2];
        b4.Content = trubyte[3];
    }

如果该方法返回您已有的随机数,只需获取另一个随机数即可。

void getnumbers()
{
    Random r = new Random();
    int num;
    var trubyte = new List<int>();
    for (var x = 0; x < 4; ++x)
    {
        do
        {
            num = r.Next(1, 5);
        } while(trubyte.Contains(num));
        trubyte[x] = num;   
    }
    b1.Content = trubyte[0];
    b2.Content = trubyte[1];
    b3.Content = trubyte[2];
    b4.Content = trubyte[3];
}

我使用 List 而不是数组只是因为它立即提供了 Contains 方法,而不是任何其他特殊原因。

如果你想生成一大堆随机的、不重复的数字(在最坏的情况下是 O(n^2),这是没有效率的,但对于 4 个数字来说,它绰绰有余;)

随机数生成器函数可以返回重复项,因为输出是随机的。

如果您使用 RNG 生成必须唯一的数字,则需要在使用它们之前验证它们是否尚未生成。

你不能在Windows Mobile上使用这样的东西[0]吗?这似乎比编写自己的 RNG 更实用。

0: http://msdn.microsoft.com/en-us/library/system.security.cryptography.randomnumbergenerator(v=vs.90).aspx

你必须自己做,这意味着检查一个数字是否已经生成。

你可以像gjulianm说的那样做,但这是一个很长的数字列表,比如说1000你会浪费很多时间。因此,如果您想要 1000 的随机列表,您可以通过以下方式进行

  • 初始化大小为 1000 的数组 trubyte,使用trubyte[0]=1,trubyte[1]=2,依此类推...
  • 初始化变量数组大小=1000
  • 运行一个循环 1000 次,其中首先提取一个随机数 k BTW 0-(arraysize-1)。您的随机数是 a[k],您可以在列表中单独列出。现在将 trubyte[k] 换成 trubyte[arraysize]。最后将数组大小减少 1。

另一种方法,如果你不想在循环中时显示数字,只需在循环执行后使用更改的列表

void getnumbers(){
Random r = new Random();
int num;
int[] trubyte = new int[1000];
int finalList[] =  new int[1000]
for (int x = 0; x < 1000; ++x)
{
 trubyte[x]=x+1;
}
int arraysize=1000;
for (var x = 0; x < 1000; ++x)
{
    int k=r.Next(0, arraysize);
    finalList[x]=trubyte[k];
    trubyte[k]=trubyte[arraysize-1];
    arraysize--;
}
//use the finalList

}

我们可以在Windows Phone应用程序中使用字典而不是hash-set。下面是用于生成不同随机数的代码。

    static int[] GetRandomNumbersNonrepeat(int noOfRandomNumbers, int maxValue)

    {
        Dictionary<int, int> randomnumbers = new Dictionary<int, int>();
        while (randomnumbers.Count < maxValue)
        {
            Random r = new Random();
            int rnum = r.Next(1, maxValue+1);
            if (!randomnumbers.ContainsValue(rnum))
            {
                randomnumbers.Add(randomnumbers.Count + 1, rnum);
            }
        }

        int[] rnums = randomnumbers.Values.ToArray<int>();
        return rnums;
    }

最新更新