Возврат C ++ (iform_int_distribution) из функции - PullRequest
4 голосов
/ 01 апреля 2020

Я создал этот случайный класс, чтобы я мог использовать случайные числа в своем игровом движке в любое время, когда мне нужно, но у меня проблема с функциями. Как я должен возвращать R? (пожалуйста, имейте ввиду, что я новичок в кодировании в целом)

#pragma once
#include <ctime>
#include <random>

using namespace std;

class Random
{
private:


public:
    Random() { default_random_engine RandomNumber(time(0));};

    int RandomNumber()
    {
        uniform_int_distribution<int> R();
         return = R;
    }

    float RandomFloat()
    {
        uniform_int_distribution<float> R();
    }

    int RandomNumberRange(int Min =0,int Max =0)
    {
        uniform_int_distribution<int> R(Min,Max);
    }

    float RandomFloatRange(float Min = 0, float Max = 0)
    {
        uniform_int_distribution<float> R(Min,Max);
    }}; 

Ответы [ 2 ]

4 голосов
/ 01 апреля 2020

Предполагается, что механизм случайных чисел используется повторно, но в настоящее время вы объявляете его как локальную переменную, которая больше никогда не используется и уничтожается при выходе из конструктора. Вместо этого сделайте default_random_engine членом вашего класса.

Затем, чтобы получить фактическое случайное число из распределения, вам нужно вызвать его через перегруженный оператор вызова и передать его механизму случайных чисел:

class Random
{
private:
    default_random_engine RandomNumber{time(0)};

public:

    int RandomNumberRange(int Min =0,int Max =0)
    {
        return uniform_int_distribution<int>{Min,Max}(RandomNumber);
    }

    //...
};

Нет никаких причин возвращать сам дистрибутив. Поэтому я истолковал ваш вопрос таким образом, что, вероятно, имеет больше смысла.

Также обратите внимание, что засев с time(0), вероятно, плохой. Но это огромный топи c сам по себе. В частности, если вы случайно создадите несколько экземпляров класса Random, они будут одинаково заполнены. Вместо этого

default_random_engine RandomNumber{std::random_device{}()};

может работать лучше. вероятно будет использовать случайные числа, предоставленные системой. (Но это не так, например, более старые версии MinGW действительно генерировали детерминированные c результаты таким образом.)

1 голос
/ 01 апреля 2020
    int RandomNumber()
    {
        uniform_int_distribution<int> R();
        return = R;
    }

Тип возврата и тип R в вышеуказанной функции различаются. R имеет тип uniform_int_distribution<int>, тогда как тип возвращаемого значения - int. Для возврата R() необходимо изменить тип возвращаемого значения функции.

    uniform_int_distribution<int> RandomNumber()
    {
        uniform_int_distribution<int> R;
        return R;
    }

Обратите внимание, что это не return = R. return - это ключевое слово, а не переменная, которую вы можете назначить. Чтобы вернуть переменную просто используйте return R;.

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