C ++随机生成的词典单词仅显示以B开头的单词

时间:2018-06-29 00:47:10

标签: c++

我正在为应该从字典中获取随机单词的应用程序编写代码。我写的这段代码是从文本文件中随机选择一行的,该文本文件有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;
 }

2 个答案:

答案 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