0

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

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

5 回答 5

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 个数字来说已经足够了;)

于 2012-12-10T21:57:06.173 回答
0

我们可以在 windows phone 应用程序中使用字典而不是哈希集。下面是生成不同随机数的代码。

    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;
    }
于 2012-12-12T09:52:43.550 回答
0

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

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

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

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

于 2012-12-10T11:41:03.283 回答
0

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

于 2012-12-10T11:41:35.613 回答
0

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

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

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

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

}

于 2012-12-11T11:33:14.727 回答