C# 随机化数组列表
我试图制作一个loto数字生成器程序,输出6个唯一的随机数。 我以前使用collections.shuffle方法在java中实现过这一点。我在c中找不到这样的方法。我看到唯一可用的方法是随机方法。我尝试在代码中使用此方法,但它不会生成唯一的随机数。有时is会在我的loto number程序中生成重复的数字。我已经把我的代码的副本放在这里让你看一看,并为你评论了它,这样你就可以看到我正在尝试做什么。谢谢C# 随机化数组列表,c#,collections,arraylist,shuffle,C#,Collections,Arraylist,Shuffle,我试图制作一个loto数字生成器程序,输出6个唯一的随机数。 我以前使用collections.shuffle方法在java中实现过这一点。我在c中找不到这样的方法。我看到唯一可用的方法是随机方法。我尝试在代码中使用此方法,但它不会生成唯一的随机数。有时is会在我的loto number程序中生成重复的数字。我已经把我的代码的副本放在这里让你看一看,并为你评论了它,这样你就可以看到我正在尝试做什么。谢谢 static void Main(string[] args) {
static void Main(string[] args)
{
Random number = new Random();// object to randomize the arraylist ,LIST.
ArrayList list = new ArrayList();
for (int i = 1; i <= 49; i++) // Loop to populate the arraylist with int values from 1 to 49.
{
list.Add(i);
Console.WriteLine(number.Next(i)); // Output the contents of the arraylist in a randome order. (This produces duplicat numbers.
// I am trying to produce a loto number generator program. No duplicat numbers. Each random number must be unique.
}
for (int i = 1; i <= 6; i++)// This loop was going to be used to trip the ammount of random numbers displayed.
{
检查ArrayList中是否包含随机数
var rnd = new Random();
var list = new ArrayList();
while (list.Count <= 6)
{
int t = rnd.Next(1, 49);
while (list.Contains(t))
{
t = rnd.Next(1, 49);
}
list.Add(t);
}
您可以使用Fisher-Yates洗牌算法和随机数生成器洗牌数组:
static void Shuffle(ref ArrayList list)
{
Random rng = new Random();
for (int i = list.Count - 1; i >= 0; i--)
{
// Note: It's important to only select a number into each index
// once. Otherwise you'll get bias toward some numbers over others.
int number = rng.Next(i); // Choose an index to swap here
Swap(ref list[i], ref list[number]) // Swap it
}
}
static void Swap(ref int first, ref int second)
{
int temp = first;
first = second;
second = temp;
}
static void Main(string[] args)
{
ArrayList list = new ArrayList();
for(int i = 1; i <= 49; i++)
{
list.Add(i);
}
Shuffle(ref list);
for (int i = 1; i <= 6; i++)
{
// Use the shuffled list
}
}
不过,如果您只想选择六个唯一的随机数,则不需要对数组进行洗牌。您只需跟踪以前生成的数字,如果得到重复的数字,则可以重新生成下一个数字
static ArrayList GetUniqueRandomNumbers(int min, int max, int count)
{
Random rng = new Random();
ArrayList result = new ArrayList();
while(ArrayList.Count < count)
{
int number = rng.Next(min, max);
// Only add if it hasn't been generated yet
if (!result.Contains(number))
{
result.Add(number);
}
}
}
static void Main(string[] args)
{
ArrayList loto = GetUniqueRandomNumbers(1, 49, 6);
for (int i = 1; i <= 6; i++)
{
// Use the generated numbers
}
}
有很多解决方案,如何在列表或数组中重新排序数字。您可以:生成数字列表1..49,重新排序集合,取前6个。我的扩展方法:似乎非常接近。注意+1可能有一个比洗牌更好的方法。不过,您可能希望更清楚地了解这样一个事实,即您正在对同一个问题采取非洗牌方法。这可能会让你落选。