首页 > 解决方案 > 在 Unity/C# 中让某事有 1% 的机会发生

问题描述

我希望我的游戏中有一个稀有物体在 100 次中产生 1 次。这是我的代码:

int random = Random.Range(0, 99);

if (random < 1)
{
    //rare gameobject spawns
}
else
{
    //common gameobject spawns
}

这对我来说很有意义,但它似乎无法正常工作。我在 20 到 30 次中看到了大约 1 个这种罕见的游戏对象。为什么会经常发生?

标签: c#unity3d

解决方案


问题在于,让事情变得非常随机对于计算机来说是一项相当艰巨的任务。有很多关于生成随机和伪随机值的文献,我不是这个主题的专家,但基本思想包括在你的系统上获取一个发生和不断变化的值(例如时间)并按顺序修改它接收“随机”值。

如果您不会收到符合您目的的值(在您的情况下,事件发生得太频繁),请尝试使用另一种(等于更复杂)算法。

编辑:通过用某种测试函数包围它来测试你的函数,如下所示:

using UnityEngine;

public class RandomTest : MonoBehaviour
{    
    private const int TestRuns = 1000000;
    private const int Probability = 1;

    // Use this for initialization
    void Start ()
    {
        int hits = 0;

        for (int i = 0; i < TestRuns; i++)
        {
            int randomValue = Random.Range(0, 100);
            if (randomValue < Probability)
            {
                hits++;
            }
        }

        float probability = (float) hits / TestRuns * 100;

        Debug.Log("Outcome: " + probability.ToString("f4") + " %");
    }
}

对我来说,这些值非常接近预期值,并且应该(没有计算)位于标准分布内:

Outcome: 0.9984 %


推荐阅读