[英]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.