📜  加权随机 c# (1)

📅  最后修改于: 2023-12-03 15:36:59.318000             🧑  作者: Mango

加权随机

简介

加权随机是一种在给定一组元素和它们对应的权重的情况下,按照权重随机选择其中一个元素的算法。在实际开发中,加权随机可以被用来实现多种需求,如随机推荐、抽奖等。

实现

下面是一个简单的 C# 实现,我们使用了一个 List 来保存元素和权重的对应关系,然后利用 System.Random 生成随机数,在 O(n) 的时间内计算出选中的元素。

using System;
using System.Collections.Generic;

public class WeightedRandom<T>
{
    private readonly List<(T, int)> _items;

    public WeightedRandom(List<(T, int)> items)
    {
        _items = items;
    }

    public T GetRandomItem()
    {
        int totalWeight = 0;
        foreach ((T item, int weight) in _items)
        {
            totalWeight += weight;
        }

        Random random = new Random();
        int selectedWeight = random.Next(totalWeight);
        foreach ((T item, int weight) in _items)
        {
            if (selectedWeight < weight)
            {
                return item;
            }
            selectedWeight -= weight;
        }

        throw new InvalidOperationException("No item selected");
    }
}
使用示例

我们可以利用上述实现来实现一个简单的抽奖程序,如下所示:

using System;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        List<(string, int)> rewards = new List<(string, int)>
        {
            ("iPhone 12", 1),
            ("Macbook Pro", 3),
            ("Apple Watch", 6),
            ("AirPods Pro", 10),
            ("$50 Coupon", 100)
        };

        WeightedRandom<string> random = new WeightedRandom<string>(rewards);

        Console.WriteLine("Congratulations! You won a " + random.GetRandomItem());
    }
}

这个程序会从 rewards 列表中随机选择一个元素作为奖品,根据该元素对应的权重,高权重元素会被选中的概率更大。

总结

本文介绍了加权随机的概念及实现方法。通过加权随机,我们可以实现多种需求,如随机推荐、抽奖等。