我试图创建一个游戏一个基于百分比的概率。 例如,如果一个项目有一个暴击有45%的机会,那一定意味着它是45 100的命中将是至关重要的。
首先,我试图用一个简单的解决方案:
R = new Random();
int C = R.Next(1, 101);
if (C <= ProbabilityPercent) DoSomething()
但在100次迭代的例如48%的机会,它给40-52超出100同去的49,50,51,因此,有这些“百分比”之间没有什么区别。
现在的问题是如何设置的如50个,并随机获得的100严格50? 这是一个机会,以增加机会找到一个项目发现罕见物品的概率非常重要的事情。 因此,1%的buff会sensinble,因为现在还不是。
对不起,我的英语不好。
你只需要考虑在均匀分布在反复滚动的条款。
你可以不看超过100卷,因为这迫使以产生精确的 45 不会是随机的 。 通常,这样的轧辊应表现出“缺乏记忆”。 例如,如果你滚骰子寻找6,你有一个1英寸-6机会。 如果你滚5次,并没有得到一个六 - 那么:在下滚得到一个6的可能性不是1它仍然是1 6。因此,你只能看着它满足了如何当在统计学上大量事件摊销您的期望...... 100000说。
基本上是:你当前的代码是好的。 如果用户知道(因为他们已经打了55次无一关键),未来45次命中必须是至关重要的,那么它不再是随机的,他们可以通过游戏系统。
也; 暴击伤害的45%的几率似乎有点高,P
我试图创建一个游戏一个基于百分比的概率。 例如,如果一个项目有一个暴击有45%的机会,那一定意味着它是45 100的命中将是至关重要的。
不,这不是真的。 你完全missunderstud概率的概念。 你不希望有一个“基于百分比的概率”,想要“的100个样本基于百分比的随机分布”。
你需要的是一个“事件的包”,其中45“crytical”和他们的55“非crytical”。 一旦你从包里选择一个事件,你只有剩余的事件来接的下一次。
您可以用这种方式进行建模的:
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
由于我在C#中没有专家,我将使用便于C ++函数,但仍适用于任何语言。
兰特() - 随机数发生器。
//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
我已经使用这个方法来创建非常大的渗出电网和它做工精良的精度值。
问题是,与Random
你可能想只有一次初始化这个类。
这是因为Random
使用系统时间用于生成随机数种子。 如果你的循环是非常快的是可能发生的多重随机实例使用相同的种子,从而产生相同的数字。
检查生成的数字,如果你怀疑这种情况正在发生。
除此之外,固有的随机性的是,它不会给你确切的结果。 这意味着,即使有50/50的机会是可能发生的100“正面”或“反面”的顺序给“头”的100倍。
你唯一可以做的事情是,一旦创建随机实例,并与现场的结果; 否则,你不应该使用随机的。