设置百分比并使其看起来随机

时间:2014-08-04 12:35:18

标签: c# arrays

如何设置百分比,让它们看起来随意?

我理解如何使数组随机。这很容易。现在是困难的部分。 我想知道如何设置数组中每个项目的百分比,看起来该数组中的每个项目都以随机顺序显示。

你能为数组中的每个项目设置百分比吗?或者我们只有随机工作?

1 个答案:

答案 0 :(得分:0)

为此,您必须将重量与每种可能性相关联。它不一定是百分比。

这是一个具有权重的通用项目的示例

public class WeightedItem<T>
{
    public T Item { get; set; }
    public int Weight { get; set; }

    public WeightedItem(T item, int weight=1)
    {
        Item = item;
        Weight = weight;
    }
}

要选择随机所有项目之一,您只需提供权重较高的项目更好的机会

public static class WeightedRandomizer<T>
{
    private static System.Random _random;

    static WeightedRandomizer()
    {
        _random = new System.Random();    
    }

    public static T PickRandom(List<WeightedItem<T>> items)
    {
        int totalWeight = items.Sum(item => item.Weight);
        int randomValue = _random.Next(1, totalWeight);

        int currentWeight = 0;
        foreach (WeightedItem<T> item in items)
        {
            currentWeight += item.Weight;
            if (currentWeight >= randomValue)
                return item.Item;
        }

        return default(T);
    }
}

例如:

var candidates = new List<WeightedItem<string>>
{
    new WeightedItem<string>("Never", 0),
    new WeightedItem<string>("Rarely", 2),
    new WeightedItem<string>("Sometimes", 10),
    new WeightedItem<string>("Very often", 50),
};

for (int i = 0; i < 100; i++)
{
    Debug.WriteLine(WeightedRandomizer<string>.PickRandom(candidates));
}

这些项目的可能性是:

&#34;决不&#34; :0次中的62次(0%)

&#34;很少&#34; :62次中的2次(3.2%)

&#34;有时&#34; :62次中的10次(16.1%)

&#34;经常&#34 ;: 62次中的50次(80.6%)

您可以使用任何其他类型,例如图片,数字或您自己的类别,而不是字符串。