C# 避免随机重复 System.Random generator=new Random(DateTime.Now.毫秒); int[]lotteryNumber=新int[7]; 控制台。WriteLine(“您的彩票号码:”); 对于(int i=0;i

C# 避免随机重复 System.Random generator=new Random(DateTime.Now.毫秒); int[]lotteryNumber=新int[7]; 控制台。WriteLine(“您的彩票号码:”); 对于(int i=0;i,c#,arrays,C#,Arrays,您可以将它们放入一个散列集中。如果您添加,并且返回false,则生成一个新的数字。如果您试图从一个范围中不重复地拾取数字,则需要创建一个包含所有可能数字的数组,然后将随机选择“洗牌”: System.Random generator = new Random(DateTime.Now.Millisecond); int[] lotteryNumber = new int[7]; Console.WriteLine("Your lottery numbers: "); for (int i =

您可以将它们放入一个
散列集中
。如果您
添加
,并且返回false,则生成一个新的数字。

如果您试图从一个范围中不重复地拾取数字,则需要创建一个包含所有可能数字的数组,然后将随机选择“洗牌”:

System.Random generator = new Random(DateTime.Now.Millisecond);
int[] lotteryNumber = new int[7];

Console.WriteLine("Your lottery numbers: ");
for (int i = 0; i<7; i++)
{
    lotteryNumber[i] = generator.Next(1, 37);
    Console.Write("{0} ",lotteryNumber[i]);
}
Console.ReadLine();
int[]allPossibleNumbers=Enumerable.Range(1,37).ToArray();
int[]lotteryNumber=新int[7];
对于(int i=0;i<7;i++)
{
int-index=r.Next(i,37);
lotteryNumber[i]=所有可能的枚举数[索引];
allPossibleNumbers[index]=allPossibleNumbers[i];
//此步骤不是必需的,但允许您重用所有可能的枚举
//而不是每次都产生一个新的。
//allPossibleNumbers[i]=彩票号码[i];
}

IMO最简单的方法是生成一个包含所有可能数字(即1-37)的序列,对集合进行洗牌,然后获取前七个结果

在堆栈溢出上搜索“Fisher-Yates shuffle C#”将找到许多示例

事实上,您可以修改Fisher-Yates shuffle以在获取结果时生成结果,因此您可以编写一个方法,例如:

int[] allPossibleNumbers = Enumerable.Range(1, 37).ToArray();
int[] lotteryNumber = new int[7];
for (int i = 0; i < 7; i++)
{
    int index = r.Next(i, 37);
    lotteryNumber[i] = allPossibleNumbers[index];
    allPossibleNumbers[index] = allPossibleNumbers[i];
    // This step not necessary, but allows you to reuse allPossibleNumbers
    // rather than generating a fresh one every time.
    // allPossibleNumbers[i] = lotteryNumber[i];
}

生成包含37个项目的列表。
然后在for中,选择一个并删除所选的

您可以使用字典,但要确保防止重复的键插入。字典的键将用作您需要的唯一数字

如果您获得现有的数字,请尝试查找不在数组中的新数字,这可能会有所帮助:

var numbers = Enumerable.Range(1, 37).Shuffle().Take(7).ToList();
static void Main(字符串[]args)
{
System.Random generator=new Random(DateTime.Now.毫秒);int[]lotteryNumber=new int[7];
控制台。WriteLine(“您的彩票号码:”);
对于(int i=0;i<7;i++)
{
int lNumber=0;
做
{
lNumber=生成器。Next(1,37);
}
while(lotteryNumber.Contains(lNumber));
乐透号码[i]=号码;
Console.Write(“{0}”,lotteryNumber[i]);
}
Console.ReadLine();
}
HashSet=newhashset();
System.Random generator=新随机数(DateTime.Now.毫秒);
while(set.Count<7){
集合。添加(发生器。下一个(1,37);
}

这应该行得通,因为哈希集会自动忽略重复项。只需循环,直到该集达到所需的单位数。唯一的潜在问题是它有潜力(不太可能)循环很长一段时间,但它最终会响应。

所以我使用了您的原始代码…发现了一些逻辑错误,并添加了您正在寻找的修复程序,以防止随机数重复

享受吧

HashSet<int> set = new HashSet<int>();
System.Random generator = new Random(DateTime.Now.Millisecond);

while(set.Count < 7){
    set.Add(generator.Next(1,37);
}
System.Random generator=new Random(DateTime.Now.毫秒);
int[]lotteryNumber=新int[7];
int lowerBounds=1;
int上界=8;
int maxNumberLotteryValues=7;
if((上限-下限)<(maxNumberLotteryValues))
{
控制台。写入(“警告:调整上限和下限…没有足够的值来创建一组唯一的彩票号码!”);
}
其他的
{
控制台。WriteLine(“您的彩票号码:”);
对于(int i=0;iconst int nball=37;
常数int nPicks=6;
int[]balls=新int[nPicks];
Random rnd=新随机(DateTime.Now.毫秒);
整型剩余球=N球;
int remainingPicks=nPicks;

对于(int i=1;i),此方法将有明显的开销,但在消除重复性时将是万无一失的。@PLB:或者简单地将其洗牌。谢谢,这非常有效!我还没有了解您编写的代码的第一句话。“Enumerable.Range(1,37).ToArray();”部分,所以我想一定有另一种方法可以达到同样的效果。你可以只做
int[]allPossibleNumbers=newint[]{1,2,3,4,5,/*yawn*/,36,37};
-我的只是懒惰版本。
HashSet<int> set = new HashSet<int>();
System.Random generator = new Random(DateTime.Now.Millisecond);

while(set.Count < 7){
    set.Add(generator.Next(1,37);
}
 System.Random generator = new Random(DateTime.Now.Millisecond);
            int[] lotteryNumber = new int[7];
            int lowerBounds = 1;
            int upperBounds = 8;
            int maxNumberLotteryValues = 7;

            if ( ( upperBounds - lowerBounds ) < (maxNumberLotteryValues))
            {
                Console.Write("Warning: Adjust your upper and lower bounds...there are not enough values to create a unique set of Lottery numbers! ");

            }
            else
            {
                Console.WriteLine("Your lottery numbers: ");
                for (int i = 0; i < maxNumberLotteryValues; i++)
                {
                    int nextNumber = generator.Next(lowerBounds, upperBounds);
                    int count = lowerBounds;  //Prevent infinite loop

                    while ((lotteryNumber.Contains(nextNumber))
                        && (count <= upperBounds))
                    {
                        nextNumber = generator.Next(lowerBounds, upperBounds);
                        count++;  //Prevent infinite loop
                    }

                    lotteryNumber[i] = nextNumber;
                    Console.Write("{0} ", lotteryNumber[i]);
                }
            }

            Console.ReadLine();
const int nBalls = 37;
const int nPicks = 6;
int[] balls = new int[nPicks];
Random rnd = new Random(DateTime.Now.Millisecond);

int remainingBalls=nBalls;
int remainingPicks=nPicks;
for (int i = 1; i <= nBalls; i++)
{
    if (rnd.Next(1, remainingBalls+1) <= remainingPicks)
        balls[--remainingPicks]=i;
    remainingBalls--;
}

Console.WriteLine(string.Join(",",balls));