我正在尝试为游戏创建基于百分比的概率。例如。如果一个项目有45%的几率遭到致命一击,那就必须意味着它有50个点击中的45个是至关重要的。
首先,我尝试使用一个简单的解决方案:
R = new Random();
int C = R.Next(1, 101);
if (C <= ProbabilityPercent) DoSomething()
但是在100次迭代中有可能例如48%,100分中40-52。 同样适用于49,50,51。 所以,这些“百分比”之间没有区别。
问题是如何设置例如百分比50,并且随机获得严格的50分100? 对于罕见项目查找的概率而言,有机会增加查找项目的机会是非常重要的。因此,1%的buff将是敏感的,因为现在它不是。
抱歉我的英语不好。
答案 0 :(得分:9)
你只需要考虑重复滚动的均匀分布。
你不能超过100卷,因为强迫它产生完全 45 不会是随机的。通常,这种卷应该表现出“缺乏记忆”。例如,如果你掷骰子寻找一个6,你有六分之一的机会。如果你滚动它5次,并且没有得到6 - 那么:在下一次滚动中获得6的机会不是1.它仍然是1中的6。因此,你只能看看它遇到了多少在对统计数量较多的事件进行摊销时,你的期望是...... 100,000说。
基本上:你当前的代码很好。如果用户知道(因为他们已经达到55次没有关键),接下来的45次点击必须是关键的,那么它就不再是随机的,他们可以对系统进行游戏。
也; 45%的致命一击几率似乎有点高; p
答案 1 :(得分:4)
我试图为游戏创建基于百分比的概率。例如。 如果一个物品有45%的几率受到重击,那就必须意味着它是45 100次点击将是至关重要的。
不,那不是真的。你完全错过了概率概念。你不想要基于百分比的概率&#34;,你想要一个基于百分比的随机分布100个样本&#34;。
你需要的是一系列事件&#34;其中45个&#34; crytical&#34;其中55个&#34;非哭泣&#34;。一旦你从行李中挑选了一个事件,你只能在下一次选择剩下的事件。
你可以这样建模:
Initialize two integer variables Crytical and NonCrytical so that they sum exactly 100 according to the desired percetnages.
Get a random value from 1 to Crytical+NonCrytical
If the random value is less than the value of Crytical, let you hit be crytical and:
Crytical = Crytical -1
Else, let your hit be non-crytical
NonCrytical = NonCrytical-1
End If
Repeat until Crytical+NonCrytical = 0
答案 2 :(得分:2)
由于我不是C#的专家,我将使用C ++函数轻松但仍适用于任何语言。
rand() - 随机数生成器。
//33.34%
double probability = 0.3334;
//divide to get a number between 0 and 1
double result = rand() / RAND_MAX;
if(result < probability)
//do something
我已经使用这种方法来创建非常大的渗透网格,并且它对精度值非常有用。
答案 3 :(得分:0)
问题是,对于Random
,您可能只想初始化此类一次。
这是因为Random
使用系统时间作为生成随机数的种子。
如果您的循环非常快,则可能会发生多个Random-instances使用相同的种子并因此生成相同的数字。
如果您怀疑发生这种情况,请检查生成的数字。
除此之外,Randomness固有的是它不会给你准确的结果。 这意味着即使有50/50的可能性,100个“头”或“尾巴”的序列也会发生100次“头”。
你唯一能做的就是创建一次Random-instance并使用结果;否则你不应该使用随机。