Windows phone 7 如何在windows phone应用程序中生成不重复的随机数

Windows phone 7 如何在windows phone应用程序中生成不重复的随机数,windows-phone-7,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 =

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

    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()
{
随机r=新随机();
int[]trubyte=新的int[4];
对于(变量x=0;x<4;++x)
{
trubyte[x]=r.Next(1,5);
}
b1.内容=trubyte[0];
b2.Content=trubyte[1];
b3.Content=trubyte[2];
b4.Content=trubyte[3];
}

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

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

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


0:

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

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

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];
}
void getnumbers()
{
随机r=新随机();
int-num;
var trubyte=新列表();
对于(变量x=0;x<4;++x)
{
做
{
num=r.Next(1,5);
}while(trubyte.Contains(num));
trubyte[x]=num;
}
b1.内容=trubyte[0];
b2.Content=trubyte[1];
b3.Content=trubyte[2];
b4.Content=trubyte[3];
}
我使用
List
而不是数组,只是因为它立即提供了
Contains
方法,而不是任何其他特殊原因


如果要生成一个大的随机、未重复的数字列表(在最坏的情况下是O(n^2)),但对于4个数字,这就足够了;)

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

  • 用trubyte[0]=1、trubyte[1]=2等初始化大小为1000的数组trubyte
  • 初始化变量arraysize=1000
  • 运行循环1000次,首先提取随机数k btw 0-(arraysize-1)。您的随机数是[k],您可以在列表中单独列出。现在用trubyte[arraysize]交换trubyte[k]。最后将阵列大小减少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
void getnumbers(){
随机r=新随机();
int-num;
int[]trubyte=新int[1000];
int finalList[]=新int[1000]
对于(整数x=0;x<1000;++x)
{
trubyte[x]=x+1;
}
int arraysize=1000;
对于(变量x=0;x<1000;++x)
{
int k=r.Next(0,数组化);
finalList[x]=trubyte[k];
trubyte[k]=trubyte[arraysize-1];
排列--;
}
//使用finalList

}我们可以在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;
    }
static int[]GetRandomNumbersNoRepeat(int noOfRandomNumbers,int maxValue)
{
字典随机数=新字典();
while(randomnumbers.Count
这不是一个好方法。在字典中按值搜索与在列表中搜索相同(O(N))。你的回答和我一样,只是误用了字典。如果要使用哈希表加快对创建值的搜索,请将随机数添加为每对值的键。这样,对已经创建的值的搜索将是O(1)操作。