Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何根据百分比进行随机选择_C#_Random - Fatal编程技术网

C# 如何根据百分比进行随机选择

C# 如何根据百分比进行随机选择,c#,random,C#,Random,我有一堆大小不一的物品,从1-10 我想让物品的大小取决于物品大小的百分比或几率 例如: 物品成为尺码的几率1=50%几率 物品成为尺码的几率5=20%几率 物品成为尺码的几率10=5%几率 当然,我知道我需要使用随机生成器 但我只是想知道你们中的一些人会如何在C#中理解这一逻辑?首先:提供的概率加起来不是100%: 所以你必须检查这些值。您可能希望每美分生成以下内容: // Simplest, but not thread safe private static Random s_Random

我有一堆大小不一的物品,从
1-10

我想让物品的大小取决于物品大小的百分比或几率

例如:

物品成为尺码的几率
1
=
50%
几率

物品成为尺码的几率
5
=
20%
几率

物品成为尺码的几率
10
=
5%
几率

当然,我知道我需要使用
随机
生成器


但我只是想知道你们中的一些人会如何在C#中理解这一逻辑?

首先:提供的概率加起来不是100%:

所以你必须检查这些值。您可能希望每美分生成以下内容:

// Simplest, but not thread safe
private static Random s_Random = new Random();

...
int perCent = s_Random.Next(0, 100);

if (perCent < 50)               //  0 .. 49
{
    // return Item of size 1
}
else if (perCent < 50 + 20)     // 50 .. 69
{
    // return Item of size 5
}
else if (perCent < 50 + 20 + 5) // 70 .. 74 
{
    // return Item of size 10
} 
...
//最简单,但不是线程安全的
私有静态随机s_Random=新随机();
...
int perCent=s_Random.Next(01100);
如果(百分比<50)//0。。49
{
//大小为1的退货商品
}
如果(百分比<50+20)//50。。69
{
//返回项目的大小5
}
否则,如果(百分比<50+20+5)//70。。74
{
//10号退货
} 
...

使用我的方法。它简单易懂。 我不计算0…1范围内的部分,我只使用“概率池”(听起来很酷,是吗?) 我列出了我想从中选择的所有元素。每个元素都有自己的机会。将最常见元素的概率设置为100是很有用的,因此大多数稀有元素的概率为60或50

`
//一些c`lass或struct表示要轮盘赌的项目
公共类项目
{
公共字符串名称;//不仅仅是字符串,任何类型的数据
public int chance;//获取此项目的机会
}
公共类比例选择
{
公共静态随机rnd=新随机();
//用于从任何位置使用的静态方法。您可以使其重载,以便不仅接受列表,还接受数组:
//公共静态项SelectItem(项[]项)。。。
公共静态项SelectItem(列表项)
{
//计算所有部分的总和。
int poolSize=0;
对于(int i=0;iif(randomNumber)用50个1、20个5和5个10(以及其他,直到列表中有100个项目)。然后获取一个介于0和99之间的随机数,并将其作为列表的索引,以获取相应的值。不,OP是询问如何获取具有给定分布的随机数。投票给repoen。不,OP是询问如何进行比例/轮盘选择,就像Corak answers(这应该是一个答案!)。当然,现在也有人问了这个问题。
50%+20%+5%=75%
的可能重复并不等于
100%
,那么完整的可能性是什么呢?太棒了。非常感谢。另一件事是,提供的物品数量可以从5-50不等。那么,有没有办法在这些物品之间的任何数量之间分配重量呢1-50。例如-项目#1最大尺寸为50。那么我如何使每个尺寸都有重量?因为在50的内部有10号、2号、20号等。我希望这是有意义的。
// Simplest, but not thread safe
private static Random s_Random = new Random();

...
int perCent = s_Random.Next(0, 100);

if (perCent < 50)               //  0 .. 49
{
    // return Item of size 1
}
else if (perCent < 50 + 20)     // 50 .. 69
{
    // return Item of size 5
}
else if (perCent < 50 + 20 + 5) // 70 .. 74 
{
    // return Item of size 10
} 
...
`

// Some c`lass or struct for represent items you want to roulette
public class Item
{
    public string name; // not only string, any type of data
    public int chance;  // chance of getting this Item
}

public class ProportionalWheelSelection
{
    public static Random rnd = new Random();

    // Static method for using from anywhere. You can make its overload for accepting not only List, but arrays also: 
    // public static Item SelectItem (Item[] items)...
    public static Item SelectItem(List<Item> items)
    {
        // Calculate the summa of all portions.
        int poolSize = 0;
        for (int i = 0; i < items.Count; i++)
        {
            poolSize += items[i].chance;
        }

        // Get a random integer from 0 to PoolSize.
        int randomNumber = rnd.Next(0, poolSize) + 1;

        // Detect the item, which corresponds to current random number.
        int accumulatedProbability = 0;
        for (int i = 0; i < items.Count; i++)
        {
            accumulatedProbability += items[i].chance;
            if (randomNumber <= accumulatedProbability)
                return items[i];
        }
        return null;    // this code will never come while you use this programm right :)
    }
}

// Example of using somewhere in your program:
        static void Main(string[] args)
        {
            List<Item> items = new List<Item>();
            items.Add(new Item() { name = "Anna", chance = 100});
            items.Add(new Item() { name = "Alex", chance = 125});
            items.Add(new Item() { name = "Dog", chance = 50});
            items.Add(new Item() { name = "Cat", chance = 35});

            Item newItem = ProportionalWheelSelection.SelectItem(items);
        }