在 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
属性 的定义方式
我想运行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
属性 的定义方式