这是生成随机数的代码,但是我得到了重复的数字,我该如何克服这个问题。
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;
}