我需要一些帮助以及C#代码的百分比机会。让我们说我有从1到100的循环,在那个循环中我有一个" if"我希望执行70%的代码(随机)。我怎么做到这一点?所以像这样:
static void Main(string[] args)
{
var clickPercentage = 70;
for (int i = 0; i < 100; i++)
{
if (chance)
{
//do 70% times
}
}
}
因此,对于顶级示例,我希望如果代码被击中的可能性为70%,对于我的示例约为70次。
我尝试过的事情:(远不及70%,更像是1%或2%的几率)
static void Main(string[] args)
{
var clickPercentage = 70;
for (int i = 0; i < 100; i++)
{
var a = GetRadnomNumber(1, clickPercentage);
var b = GetRadnomNumber(1, 101);
if (a <= b)
{
Console.WriteLine($"Iteracija {i} - {b} <= {a}");
}
}
}
public static int GetRadnomNumber(int min, int max)
{
var random = new Random();
var retVal = random.Next(min, max);
return retVal;
}
答案 0 :(得分:8)
使用Random
class。
您可以使用Random.Next(100)
获取0到99之间的随机int
:
public static Random RandomGen = new Random();
.....
int clickPercentage = 70;
for (int i = 0; i < 100; i++)
{
int randomValueBetween0And99 = RandomGen.Next(100);
if (randomValueBetween0And99 < clickPercentage)
{
//do 70% times
}
}
重要的是不要在循环中创建随机实例,因为它的默认构造函数使用当前时间作为种子。这可能会导致循环中的重复值。这就是我使用static
字段的原因。您还可以将Random
实例传递给方法,以确保调用者负责生命周期和种子。有时使用相同的种子很重要,例如重复相同的测试。
答案 1 :(得分:2)
对您的逻辑不太确定,但是从快速浏览一下就可以在循环中创建一个随机对象。
这个问题是Random
类使用当前时间作为种子。如果种子相同,Random
类将产生相同的随机数序列。由于这些天的CPU非常快,通常会发生几次循环迭代将具有完全相同的种子,因此,随机数生成器的输出将是完全可预测的(并且与之前的相同)。
为了避免这种情况,只需创建一次Random
类的实例并在代码中重复使用它,例如
private static readonly Random _rnd = new Random();
// use _rnd in you code and don't create any other new Random() instances
答案 2 :(得分:2)
将其作为一种功能包装:
<div>
<%= label :access_rights, "Read Only", value: false %>
<%= f.radio_button :access_rights, false, :checked => true, :value => false %>
</div>
<div>
<%= label :access_rights, "Read and Write", value: true %>
<%= f.radio_button :access_rights, true, :value => true%>
</div>
并使用它:
private static Random generator = null;
/*
* Calls onSuccess() chanceOfSuccess% of the time, otherwise calls onFailure()
*/
public void SplitAtRandom(int chanceOfSuccess, Action onSuccess, Action onFailure)
{
// Seed
if (generator == null)
generator = new Random(DateTime.Now.Millisecond);
// By chance
if (generator.Next(100) < chanceOfSuccess)
{
if (onSuccess != null)
onSuccess();
}
else
{
if (onFailure != null)
onFailure();
}
}
答案 3 :(得分:0)
基本上,每次迭代都不需要新的Random
- 实例。简单地使用这个:
var r = new Random();
for(int i = 0; i < 100; i++)
{
var p = r.Next(100);
if (p >= 1 - myThreshhold) // do anything in 70% of cases
}
或者您也可以使用if (p <= myThreshold)
。