.NET 8 中取得隨機內容的新方式

隨機取(會重複)

假色我們有四種花色,要隨機取一個花色的方式:
    
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

留言

  1. 我测试中发现, Random.Shared.GetItems 似乎会取到重复的值. 不知道是不是搞错了

    回覆刪除
    回覆
    1. 非常抱歉,我下班後會再檢查一次

      刪除
    2. 感謝您的回覆,確實會取到重複的內容,已將錯誤的內容移除,謝謝您!

      刪除

張貼留言

如果有任何問題、建議、想說的話或文章題目推薦,都歡迎留言或來信: a@ruyut.com