在 C# 中使用百分比

use percentage with c#

我想运行3个场景。第一个 80% returns IsRandom = false 另外两个 10% Group "A"Group "B".

这是我的代码:

Random randomGen = new Random();

...

int clickPercentage = randomGen.Next(100);

if (clickPercentage <= 20 / 2)
{ 
    return new RandomGroup {IsRandom = true, Group = "A"};
}
else if (clickPercentage <= 20)
{
    return new RandomGroup { IsRandom = true, Group = "B" };
}
else
{
    return new RandomGroup { IsRandom = false };
}

是否正确(是否提供10%10%80%分布)?

您的分布仅大致正确:11% vs. 10% vs. 79%。请注意,

  • 第一个选项对应于 [0..10] - 11% 概率(两个 边界包括)
  • 第二个选项对应(10..20]-10%的概率(一个边界被包含,另一个被排除)
  • 最后一个选项对应(20..100) - 79%概率(both borders are excluded)

如果你坚持 10% vs. 10% vs. 80% 分布把它写成(你的代码更正):

int clickPercentage = randomGen.Next(100);

if (clickPercentage < 10)
{ 
    return new RandomGroup {IsRandom = true, Group = "A"};
}
else if (clickPercentage < 20)
{
    return new RandomGroup { IsRandom = true, Group = "B" };
}
else
{
    return new RandomGroup { IsRandom = false };
}

请注意 < 而不是 <=(请记住,当上边界 100 将被 排除)

您可以借助转向运算符稍微简化代码:

int clickPercentage = randomGen.Next(100);

return clickPercentage < 20 
  ? new RandomGroup() {IsRandom = true, Group = clickPercentage < 10 ? "A" : "B"} 
  : new RandomGroup { IsRandom = false };

编辑: 要摆脱 Resharper 的抱怨,您可以删除 else 冗余:

int clickPercentage = randomGen.Next(100);

if (clickPercentage < 10)
  return new RandomGroup {IsRandom = true, Group = "A"};
if (clickPercentage < 20)
  return new RandomGroup { IsRandom = true, Group = "B" };

return new RandomGroup { IsRandom = false };

这个

randomGen.Next(100);

return 是一个介于 0 和 99 之间的值。因此,您需要在等式测试中将 <= 更改为 <,或者使用 randomGen.Next(1, 101),这将 return 1到100之间的值。

从易于理解的角度来看,前者可能更好,但实际上这是一个品味问题。

这里的除法运算是不需要的:

if (clickPercentage <=20/2)

只需使用clickPercentage < 10

同样,使用else if (clickPercentage < 20)

您在 else 语句中实例化 RandomGroup 的方式可能是一个问题,具体取决于 Group 属性 的定义方式