c# - 在 Unity/C# 中让某事有 1% 的机会发生
问题描述
我希望我的游戏中有一个稀有物体在 100 次中产生 1 次。这是我的代码:
int random = Random.Range(0, 99);
if (random < 1)
{
//rare gameobject spawns
}
else
{
//common gameobject spawns
}
这对我来说很有意义,但它似乎无法正常工作。我在 20 到 30 次中看到了大约 1 个这种罕见的游戏对象。为什么会经常发生?
解决方案
问题在于,让事情变得非常随机对于计算机来说是一项相当艰巨的任务。有很多关于生成随机和伪随机值的文献,我不是这个主题的专家,但基本思想包括在你的系统上获取一个发生和不断变化的值(例如时间)并按顺序修改它接收“随机”值。
如果您不会收到符合您目的的值(在您的情况下,事件发生得太频繁),请尝试使用另一种(等于更复杂)算法。
编辑:通过用某种测试函数包围它来测试你的函数,如下所示:
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 %
推荐阅读
- javascript - 如何在节点 js 中使用 es6 创建枚举值?
- mysql - 按 user_id 选择行以及共享该条目的 event_id 的任何行
- jakarta-ee - 通过远程和本地接口访问 EJB
- computer-vision - 表单识别器 OCR 准确性问题
- c# - 如何使 ASP.NET Core 3.1 作为 Windows 服务运行查看其 appsettings 文件
- javascript - JavaScript 基元和堆栈
- git - 在本地和 GitHub 上合并分支
- ios - 使用 Swift 的 IOS 中 UILabel 的实际行数计算不一致的行为
- scikit-learn - Sklearn Random Forrest 不同标签编码的不同精度值
- debugging - 我如何判断 Windows (PE) 可执行文件是否具有调试符号?