Вернуть случайное слово из строки, используя std :: mt19937 - PullRequest
0 голосов
/ 21 февраля 2020

Я хочу использовать этот алгоритм для выбора случайного слова из строки:

Выберите первое слово с вероятностью 1: 1,

выберите второе слово с вероятностью 1: 2,

выберите n-е слово с возможностью 1: n

, где каждый выбор заменяет последний выбор.

Я хочу использовать std :: mt19937 для "случайности". (есть ли лучший метод?)

Моя функция должна получить строку ввода в следующем формате:

word1 word2
word3 word4 word5
word6

, где количество слов в строке не указано, а слова отделяются друг от друга пробелы или новые строки.

Это правильное использование std :: mt19937?

std::string random_word_from_string(std::string input)
{
    static auto gen = std::mt19937{std::random_device{}()};
    std::string random_word="";
    std::string word="";
    std::stringstream iss(input);
    auto count = 0u;
    while (iss >> word)
    {
        if (std::uniform_int_distribution{0u,count++}(gen) == 0)
        {
            random_word = word;
        }
    }
    return random_word;
}

Если на этот вопрос уже дан ответ на С ++, извините, но я не смог Найди это! Но я очень благодарен за то, что получил ссылку на дубликат.

1 Ответ

1 голос
/ 21 февраля 2020

Вы можете запустить следующую программу онлайн:

#include <iostream>
#include <vector>
#include <random>

std::string GetRandomString(int seed, const std::vector<std::string>& StrVector)
{
    std::mt19937 mt(seed);
    std::uniform_real_distribution<double> dist(0.0, 100.0);

    std::string ResultString= "";

    for(int i=0; i< (int) StrVector.size(); ++i)
    {
        if(dist(mt) < 100.0/(i+1))
            ResultString = StrVector[i];
    }

    return ResultString;
}

int main()
{ 
    std::vector<std::string> StrVector;

    StrVector.push_back("Hello");
    StrVector.push_back("my");
    StrVector.push_back("name");
    StrVector.push_back("is");
    StrVector.push_back("Bob");

    std::cout << GetRandomString(0, StrVector) << std::endl;
    std::cout << GetRandomString(1, StrVector) << std::endl;
    std::cout << GetRandomString(2, StrVector) << std::endl;
    std::cout << GetRandomString(3, StrVector) << std::endl;
    std::cout << GetRandomString(4, StrVector) << std::endl;  
}

Линия

if(dist(mt) < 100.0/(i+1))

гарантирует, что вероятность выбрана так, как вы описали.

Вывод гласит:

Hello
name
Hello
name
my
...