簡體   English   中英

避免隨機重復

[英]Avoiding random duplicates

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();

我需要制作一個打印7個彩票號碼的程序,但沒有重復。 上面的代碼打印了(1-37)范圍內的7個隨機數,但重復了appaer。 我需要一種方法來防止出現重復的數字。

最簡單的方法IMO將生成所有可能數字的序列(即1-37),對集合進行洗牌,然后獲取前七個結果。

在Stack Overflow上搜索“Fisher-Yates shuffle C#”會找到很多例子。

實際上,您可以修改Fisher-Yates shuffle以在獲取結果時產生結果,因此您可以編寫一個方法,例如:

var numbers = Enumerable.Range(1, 37).Shuffle().Take(7).ToList();

您可以使用字典,但要確保防止重復鍵插入。 字典鍵將作為您需要的唯一數字

你可以將它們扔進HashSet<int> 如果您Add並返回false,則生成一個新數字。

如果你試圖從一個范圍中選擇數字而不重復 ,你需要創建一個包含所有可能數字的數組,然后“隨機”選擇一個隨機選擇:

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中,選擇一個並刪除所選的

也許這可能會有所幫助,如果您獲得現有數字,只需嘗試找到不在數組中的新數字:

static void Main(string[] args)
        {
            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++)
            {
                int lNumber = 0;
                do
                {
                    lNumber = generator.Next(1, 37);
                }
                while (lotteryNumber.Contains(lNumber));
                lotteryNumber[i] = lNumber;

                Console.Write("{0} ", lotteryNumber[i]);
            }
            Console.ReadLine();
        }
HashSet<int> set = new HashSet<int>();
System.Random generator = new Random(DateTime.Now.Millisecond);

while(set.Count < 7){
    set.Add(generator.Next(1,37);
}

這應該有效,因為HashSet會自動忽略重復項。 只需循環直到該集合達到您需要的單位數。 只有潛在的問題是它有潛在的(不太可能)循環很長一段時間,但它最終應該響應。

所以我拿了你的原始代碼......發現了一些邏輯錯誤,並添加了你想要的修復,以防止隨機數重復。

請享用!

 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));

隨着nPicks / nBalls變大,將超越Shuffle和HashSet方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM