C# 选择基于整数值的选项?

C# 选择基于整数值的选项?,c#,math,if-statement,C#,Math,If Statement,这是C# 我正在使用一个每隔几秒钟随机计算的变量来生成实体,它是一个在0到100之间随机生成的数字。目前,我的系统使用一组if/else语句,顺序从最罕见的机会到最常见的机会 如果骰子掷到32,并且一个实体有35%的几率繁殖,那么它将繁殖,而不是一个更常见的实体繁殖,比如说70%的时间。然而,在大量的if/else语句中这样做看起来非常丑陋,我相信还有另一种方法 有什么建议吗 我在做什么 int dice = RandomNumber(0-100); if(dice < 35) Spawn

这是C#

我正在使用一个每隔几秒钟随机计算的变量来生成实体,它是一个在0到100之间随机生成的数字。目前,我的系统使用一组if/else语句,顺序从最罕见的机会到最常见的机会

如果骰子掷到32,并且一个实体有35%的几率繁殖,那么它将繁殖,而不是一个更常见的实体繁殖,比如说70%的时间。然而,在大量的if/else语句中这样做看起来非常丑陋,我相信还有另一种方法

有什么建议吗

我在做什么

int dice = RandomNumber(0-100);
if(dice < 35) SpawnEntity(Gem);
else
if(dice < 60) SpawnEntity(Crate);
int骰子=随机数(0-100);
如果(骰子<35)产生实体(宝石);
其他的
如果(骰子<60)产卵实体(板条箱);

这是非常。。非常难看。它确实管用,但很难看。我确信有更好的方法做这件事。

我认为没有<代码>开关语句不起作用,因为
大小写
标签必须是常量,而不是范围

如果希望使代码通用,可以定义一个包含范围和相应实体类型的数据结构。然后编写代码,检查这些结构的列表,找出随机数属于哪个范围,并创建相应的实体。这将消除所有if/else语句,并使添加新实体或更改其范围稍微容易一些。但是,如果您正在创建的一组内容定义良好且不变,那么这并不是严格必要的

您甚至可以进一步抽象这一点,并创建一个实用函数,该函数接受一组
操作
对象,每个对象都有相应的“权重”,然后随机选择并执行一个
操作
对象,概率与其权重成正比

// Randomly executes one of the given actions (KVP values). The probability
// of a given action being chosen is proportional to its weight (KVP key).

public static void RandomlyExecute(
    Random random,
    IEnumerable<KeyValuePair<double, Action>> choices)
{
    double totalWeight = Enumerable.Sum(choices, choice => choice.Key);
    double x = random.NextDouble() * totalWeight;
    double y = 0;

    foreach (var choice in choices)
    {
        y += choice.Key;
        if (x <= y)
        {
            choice.Value();
            break;
        }
    }
}
//随机执行给定操作之一(KVP值)。概率
//选择的给定动作的大小与其权重成正比(KVP键)。
公共静态无效随机执行(
随机的,
(可数选择)
{
double totalWeight=Enumerable.Sum(choices,choice=>choice.Key);
double x=random.NextDouble()*总重量;
双y=0;
foreach(选择中的var选择)
{
y+=选择键;

if(x我认为没有。
开关
语句将不起作用,因为
大小写
标签必须是常量,而不是范围

如果要使代码通用,可以定义一个包含范围和相应实体类型的数据结构。然后编写代码检查此类结构的列表,找出随机数属于哪个范围,并创建相应的实体。这将消除所有的If/else语句,使之稍微容易一些添加新实体或更改其范围。但是,如果要创建的对象集定义良好且不变,则严格来说,这不是必需的

您甚至可以进一步抽象这一点,并创建一个实用函数,该函数接受一组
操作
对象,每个对象都有相应的“权重”,然后随机选择并执行一个
操作
对象,概率与其权重成正比

// Randomly executes one of the given actions (KVP values). The probability
// of a given action being chosen is proportional to its weight (KVP key).

public static void RandomlyExecute(
    Random random,
    IEnumerable<KeyValuePair<double, Action>> choices)
{
    double totalWeight = Enumerable.Sum(choices, choice => choice.Key);
    double x = random.NextDouble() * totalWeight;
    double y = 0;

    foreach (var choice in choices)
    {
        y += choice.Key;
        if (x <= y)
        {
            choice.Value();
            break;
        }
    }
}
//随机执行给定操作之一(KVP值)。概率
//选择的给定动作的大小与其权重成正比(KVP键)。
公共静态无效随机执行(
随机的,
(可数选择)
{
double totalWeight=Enumerable.Sum(choices,choice=>choice.Key);
double x=random.NextDouble()*总重量;
双y=0;
foreach(选择中的var选择)
{
y+=选择键;

if(x我认为没有。
开关
语句将不起作用,因为
大小写
标签必须是常量,而不是范围

如果要使代码通用,可以定义一个包含范围和相应实体类型的数据结构。然后编写代码检查此类结构的列表,找出随机数属于哪个范围,并创建相应的实体。这将消除所有的If/else语句,使之稍微容易一些添加新实体或更改其范围。但是,如果要创建的对象集定义良好且不变,则严格来说,这不是必需的

您甚至可以进一步抽象这一点,并创建一个实用函数,该函数接受一组
操作
对象,每个对象都有相应的“权重”,然后随机选择并执行一个
操作
对象,概率与其权重成正比

// Randomly executes one of the given actions (KVP values). The probability
// of a given action being chosen is proportional to its weight (KVP key).

public static void RandomlyExecute(
    Random random,
    IEnumerable<KeyValuePair<double, Action>> choices)
{
    double totalWeight = Enumerable.Sum(choices, choice => choice.Key);
    double x = random.NextDouble() * totalWeight;
    double y = 0;

    foreach (var choice in choices)
    {
        y += choice.Key;
        if (x <= y)
        {
            choice.Value();
            break;
        }
    }
}
//随机执行给定操作之一(KVP值)。概率
//选择的给定动作的大小与其权重成正比(KVP键)。
公共静态无效随机执行(
随机的,
(可数选择)
{
double totalWeight=Enumerable.Sum(choices,choice=>choice.Key);
double x=random.NextDouble()*总重量;
双y=0;
foreach(选择中的var选择)
{
y+=选择键;

if(x我认为没有。
开关
语句将不起作用,因为
大小写
标签必须是常量,而不是范围

如果要使代码通用,可以定义一个包含范围和相应实体类型的数据结构。然后编写代码检查此类结构的列表,找出随机数属于哪个范围,并创建相应的实体。这将消除所有的If/else语句,使之稍微容易一些添加新实体或更改其范围。但是,如果要创建的对象集定义良好且不变,则严格来说,这不是必需的

您甚至可以进一步抽象这一点,并创建一个实用函数,该函数接受一组
操作
对象,每个对象都有相应的“权重”,然后随机选择并执行一个
操作
对象,概率与其权重成正比

// Randomly executes one of the given actions (KVP values). The probability
// of a given action being chosen is proportional to its weight (KVP key).

public static void RandomlyExecute(
    Random random,
    IEnumerable<KeyValuePair<double, Action>> choices)
{
    double totalWeight = Enumerable.Sum(choices, choice => choice.Key);
    double x = random.NextDouble() * totalWeight;
    double y = 0;

    foreach (var choice in choices)
    {
        y += choice.Key;
        if (x <= y)
        {
            choice.Value();
            break;
        }
    }
}
//e