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

C# 设置百分比并使其看起来随机,c#,arrays,C#,Arrays,如何设置好百分比,使其看起来是随机的 我知道如何使数组随机。这是最简单的部分。现在是最难的部分。 我想知道如何设置数组中每个项目的百分比,使数组中的每个项目看起来都是以随机顺序显示的 能否为数组中的每个项目设置百分比?还是我们只有随机的工作 要做到这一点,您必须将权重与每种可能性关联起来。它不必是一个百分比 这将是一个具有重量的通用项目的示例 public class WeightedItem<T> { public T Item { get; set; } publ

如何设置好百分比,使其看起来是随机的

我知道如何使数组随机。这是最简单的部分。现在是最难的部分。 我想知道如何设置数组中每个项目的百分比,使数组中的每个项目看起来都是以随机顺序显示的


能否为数组中的每个项目设置百分比?还是我们只有随机的工作

要做到这一点,您必须将权重与每种可能性关联起来。它不必是一个百分比

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

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;
    }
}
公共类WeightedItem
{
公共T项{get;set;}
公共整数权重{get;set;}
公共权重项(T项,整数权重=1)
{
项目=项目;
重量=重量;
}
}
要从你所有的物品中随机挑选一件,你只需给重量更高的物品一个更好的机会

公共静态类加权随机生成器
{
私有静态系统。随机_随机;
静态加权随机数()
{
_random=新系统。random();
}
公共静态随机选取(列表项)
{
int totalWeight=items.Sum(item=>item.Weight);
int randomValue=_random.Next(1,总权重);
int currentWeight=0;
foreach(项中的项权重)
{
当前重量+=物料重量;
如果(当前权重>=随机值)
返回项目。项目;
}
返回默认值(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));
}
var候选者=新列表
{
新的WeightedItem(“从不”,0),
新的WeightedItem(“很少”,2),
新的WeightedItem(“有时”,10),
新的WeightedItem(“经常”,50),
};
对于(int i=0;i<100;i++)
{
Debug.WriteLine(WeightedRandomizer.PickRandom(候选者));
}
这些项目的机会是:

“从不”:62次中的0次(0%)

“很少”:62次中的2次(3.2%)

“有时”:62次中的10次(16.1%)

“经常”:62次中的50次(80.6%)


当然,您可以使用任何其他类型(如图像、数字或您自己的类)来代替字符串。

为每个项目在[01100]中生成一个随机双精度怎么样?这对你有用吗?为什么
Random
Random对你不起作用呢?我要说的是,一个比Random更好的选择是“设置数组中每个项目的百分比”。你甚至没有提到数组的类型。
SomeType[]
上的百分比是多少?您能举个例子吗?非常感谢Manfred,我可以与您合作。真棒男人干杯:-)不客气。下一次你需要这样的帮助时,给你一些建议:包括一个你希望输出是什么样子的例子,有点像黑盒子。这是一个很难问的问题,因为我有C#方面的经验。在未来,我将给出一个我期望的例子,或者至少是我实现它的尝试。
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));
}