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)操作。