这里是生成随机数的代码,但我得到重复的数字,我怎么能克服这个。
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];
}
答案 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更实用。
答案 2 :(得分:0)
你必须自己做,这意味着检查一个号码是否已经生成。
答案 3 :(得分:0)
你可以像gjulianm那样说,但这是一长串的数字,比如1000,你会浪费很多时间。因此,如果您想要一个1000的随机列表,您可以按以下方式进行
另一种方法,如果你不想在循环中使用数字只是在执行循环后使用更改的列表
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;
}