我正在为应该从字典中获取随机单词的应用程序编写代码。我写的这段代码是从文本文件中随机选择一行的,该文本文件有84,000个来自词典的英语单词,但是每次生成一个新单词时,它似乎只会向我显示以B开头的单词。这个问题?我希望每次都是完全随机的,就像一次运行程序是一个L字,第二次运行程序是一个C字。这是代码:
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <vector>
#include <string>
#include <fstream>
#include <cstdlib>
#include <random>
using namespace std;
int main()
{
srand(time(NULL));
vector<string> words;
ifstream file("words.txt");
string line;
while (getline(file, line)) words.push_back(line);
cout << words[rand() % words.size()] << endl;
system("pause");
return 0;
}
答案 0 :(得分:1)
rand
的常见实现(包括Microsoft的实现)仅返回0到32767范围内的数字。您需要的范围更大。它也不是很好的随机数来源。
您将要使用<random>
标头中提供的较新功能。有关示例,请参见this question。
答案 1 :(得分:0)
除了关于rand()
在各种平台上的局限性的其他答案之外,如果要使用随机数生成器,通常还需要为其提供种子。为rand
提供种子的方法是使用srand
函数。种子大多只需要是一个在每次程序运行时都不同的值。通常,人们会使用当前时间或类似时间,但是从/ dev / random或您的平台等效文件中读取一些字节也很常见。这些都没有特别好的随机性,但总比没有好。首次致电srand(time(0));
之前,请尝试添加类似rand
的内容。只需执行一次,而不是每次调用rand
一次。
如果您需要真正的随机性并且可以使用现代c ++,则可能需要通读https://en.cppreference.com/w/cpp/numeric/random,尤其是std :: uniform_int_distribution。
您想要的代码非常类似于:
std::random_device r;
std::default_random_engine engine(r());
std::uniform_int_distribution<int> dist(0, words.size() -1);
std::cout << words[dist()] << std::endl;
尽管您可以使用其他引擎等。人们建议使用的常见随机引擎是std::mt19937
。