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