如何在Windows Phone应用程序中生成随机数而不重复

时间:2012-12-10 11:25:31

标签: windows-phone-7

这里是生成随机数的代码,但我得到重复的数字,我怎么能克服这个。

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

5 个答案:

答案 0 :(得分:2)

如果方法返回已有的随机数,则获取另一个随机数。

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个数字,这是绰绰有余的;)

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

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

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

}

答案 4 :(得分:0)

我们可以在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;
    }