ранд с вектором строк в мультикарте - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть вектор строк и он имеет три цвета. Мой вывод дает мне только один первый цвет «красный», где я хочу, чтобы он был случайным. vector<string> colors = {"red", "green", "yellow"}; что-то не так с этим кодом Variety x= static_cast<Variety>(rand()%3); fruit.insert(make_pair(x,colors[rand()%3])); Я пытался сделать +1, но это просто делает его зеленым.

enum class Variety {
    orange,
    pear,
    apple
};

vector<string> colors = {"red", "green", "yellow"};

struct Fruit {
    Variety v; string color; // red, green or orange
};

int main() {
    multimap<Variety,string> fruit;
    bool foundOrange;
    for (auto j = 0; j < (rand() % 100 + 1); ++j) {
        Variety x = static_cast<Variety>(rand() % 3);
        fruit.insert(make_pair(x, colors[rand() % 3]));
    }
    return EXIT_SUCCESS;
}

1 Ответ

2 голосов
/ 28 февраля 2020

Правильный способ использования rand() - сначала позвонить srand(). srand() сгенерирует серию случайных чисел, а rand() просто перебирает их. Если вы не позвоните srand(), вы будете получать один и тот же номер каждый раз, когда будете использовать 'rand () `.

srand пример:

int main() {
    // Call this function once to generate the random numbers using the seed `time(NULL)`
    srand(time(NULL));

    for (size_t i = 0; i < 10; i++) {
        std::cout << rand() % 5 << std::endl; // Go through the random numbers series
    }

    return EXIT_SUCCESS;
}

Однако в В C ++ есть библиотека <random>, которая облегчит вашу жизнь в задаче генерации случайных чисел (и будет работать действительно лучше, чем при использовании srand & rand).

// Function to generate random numbers between `min` and `max` params
size_t get_random(size_t min, size_t max) {
    // the generator will only be seeded once since it's static (Equivalent to calling `srand` once)
    static std::mt19937 gen(std::random_device{}());
    std::uniform_int_distribution<size_t> dist(min, max);
    return dist(gen); // generate random number
}

Кредит на идею функции: @ TedLyngmo .
Другие подробности: Все объекты, созданные с помощью конструктора, имеют одинаковые векторы

...