Сделайте что-нибудь с вероятностью 1% в Unity / C # - PullRequest
0 голосов
/ 11 мая 2018

Я хочу, чтобы редкий объект в моей игре появлялся 1 из 100 раз. Это мой код:

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

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

Это имеет смысл для меня, но, похоже, работает неправильно. Я видел этот редкий игровой объект примерно 1 раз в 20-30 раз. Почему это происходит так часто?

1 Ответ

0 голосов
/ 11 мая 2018

Проблема в том, что сделать вещи действительно случайными - довольно сложная задача для компьютера. Существует много литературы о генерации случайных и псевдослучайных значений, и я не эксперт в этом вопросе, но основная идея состоит в том, чтобы принимать происходящее и постоянно меняющееся значение в вашей системе (например, время ) и измените его, чтобы получить «случайное» значение.

Когда вы не получите значения, которые соответствуют вашей цели (в вашем случае событие происходит слишком часто), попробуйте использовать другой (равно более сложный) алгоритм.

Редактировать: проверить вашу функцию изолированно, окружив ее какой-нибудь тестовой функцией, подобной этой:

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 %

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...