7

我正在尝试为游戏创建基于百分比的概率。例如,如果一个物品有 45% 的几率造成暴击,那一定意味着它有 100 次命中中有 45 次是暴击。

首先,我尝试使用一个简单的解决方案:

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% 的增益是明智的,因为现在不是。

对不起,我的英语不好。

4

4 回答 4

9

您只需要考虑重复滚动的均匀分布。

你不能看超过 100 卷,因为强迫它正好产生45不会是随机的。通常,这样的卷应该表现出“缺乏记忆”。例如,如果您掷骰子寻找 6,则您有六分之一的机会。如果你掷了 5 次,但没有得到 6 - 那么:下一次得到 6 的机会不是 1。它仍然是 6 分之一。因此,你只能看它的匹配程度摊销到统计上大量的事件时您的期望... 100,000 说。

基本上:您当前的代码很好。如果用户知道(因为他们已经击中 55 次而没有重击)接下来的 45 次击中必须是重击,那么它不再是随机的,他们可以游戏系统。

还; 45%的暴击几率似乎有点高;p

于 2012-11-12T10:32:36.957 回答
4

我正在尝试为游戏创建基于百分比的概率。例如,如果一个物品有 45% 的几率造成暴击,那一定意味着它有 100 次命中中有 45 次是暴击。

不,那不是真的。您完全误解了概率的概念。您不想要“基于百分比的概率”,您想要“基于百分比的 100 个样本的随机分布”。

你需要的是一个“事件包”,其中 45 个是“关键的”,其中 55 个是“非关键的”。从包中选择一个事件后,您下次只能选择剩余的事件。

你可以这样建模:

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
于 2012-11-12T10:38:43.503 回答
4

由于我不是 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

我已经使用这种方法创建了非常大的渗透网格,它对于精度值非常有效。

于 2013-08-12T20:48:51.567 回答
0

问题是,Random您可能只想初始化这个类一次。

这是因为Random使用系统时间作为生成随机数的种子。如果您的循环非常快,则可能会发生多个随机实例使用相同的种子并因此生成相同的数字。

如果您怀疑发生这种情况,请检查生成的数字。

除此之外,随机性的固有特性是它不会给你准确的结果。这意味着即使有 50/50 的机会,100 个“正面”或“反面”的序列也可能出现 100 次“正面”。

您唯一能做的就是创建一次 Random-instance 并接受结果;否则你不应该使用随机。

于 2012-11-12T10:31:31.810 回答