隨機取(會重複)
假色我們有四種花色,要隨機取一個花色的方式:
var suits = new[] { "黑桃", "紅心", "方塊", "梅花" };
var random = new Random();
var suit = suits[random.Next(0, suits.Length)];
Console.WriteLine(suit);
不過現在 .NET 8 新出了 Random.Shared.GetItems 方法,以後要取隨機可以更簡單:
var suits = new[] { "黑桃", "紅心", "方塊", "梅花" };
var result = Random.Shared.GetItems(suits, 1);
Console.WriteLine($"{result[0]}");
就算是列舉(enum)要使用也非常方便:
var result = Random.Shared.GetItems(Enum.GetValues<Suit>(), 1);
Console.WriteLine($"{result[0]}");
public enum Suit
{
Spade,
Heart,
Diamond,
Club
}
隨機取(不重複)
註: 有網友留言補充說 GetItems 可能會重複,已移除 GetItems 的片段。假設要隨機取兩個,但是不重複呢?
有點麻煩,最簡單的方式可能就是先隨機排序,然後取前兩個了:
var suits = new[] { "黑桃", "紅心", "方塊", "梅花" };
var random = new Random();
var suits2 = new List<string>(suits);
for (var i = 0; i < suits2.Count; i++)
{
var j = random.Next(0, suits2.Count);
var temp = suits2[i];
suits2[i] = suits2[j];
suits2[j] = temp;
}
Console.WriteLine($"{suits2[0]}, {suits2[1]}");
使用語法糖可以簡化成這樣:
var suits = new[] { "黑桃", "紅心", "方塊", "梅花" };
var random = new Random();
var selectedValues = suits.OrderBy(_ => random.Next()).Take(2).ToArray();
Console.WriteLine($"{selectedValues[0]}, {selectedValues[1]}");
參考資料:
Microsoft.Learn - What's new in .NET 8 #Methods for working with randomness
我测试中发现, Random.Shared.GetItems 似乎会取到重复的值. 不知道是不是搞错了
回覆刪除非常抱歉,我下班後會再檢查一次
刪除感謝您的回覆,確實會取到重複的內容,已將錯誤的內容移除,謝謝您!
刪除感謝教學~
回覆刪除非常感謝您的支持!
刪除