我基本上,对于这项任务,必须制作一个迷你程序,根据随机数字随机生成一串字母(其中0对应于A,1对应于B,2对应于C,依此类推)与生成的第n个字符串对应的数字n一起。这些字符串及其相应的编号将打印到文本文件中。例如,如果我的函数被称为myFunction
:
myFunction("file.txt", 3)
生成一个名为“file.txt”的文本文件,其中包含以下内容:
AAAAAAAA 1
IWFNWEFS 2
WEWEFCSD 3
字符串的字母每个都应该随机化。
但是,由于某些原因,我的每个字符串都是相同的。也就是说,对于每一串字符串对,所有字符串都是相同的(当我应该使它们全部不同/随机时)。为什么会这样?这是我的代码:
#include <iostream>
#include <vector>
#include <cstdlib>
#include "math.h"
#include <fstream>
using namespace std;
string key = ""; // Empty initial key for use in "makeKey".
// "makeKey" function to create an alphabetical key
// based on 8 randomized numbers 0 - 25.
void makeKey() {
int k;
for (k = 0; k < 8; k++) {
int keyNumber = (rand() % 25);
if (keyNumber == 0)
key.append("A");
if (keyNumber == 1)
key.append("B");
if (keyNumber == 2)
key.append("C");
if (keyNumber == 3)
key.append("D");
if (keyNumber == 4)
key.append("E");
if (keyNumber == 5)
key.append("F");
if (keyNumber == 6)
key.append("G");
if (keyNumber == 7)
key.append("H");
if (keyNumber == 8)
key.append("I");
if (keyNumber == 9)
key.append("J");
if (keyNumber == 10)
key.append("K");
if (keyNumber == 11)
key.append("L");
if (keyNumber == 12)
key.append("M");
if (keyNumber == 13)
key.append("N");
if (keyNumber == 14)
key.append("O");
if (keyNumber == 15)
key.append("P");
if (keyNumber == 16)
key.append("Q");
if (keyNumber == 17)
key.append("R");
if (keyNumber == 18)
key.append("S");
if (keyNumber == 19)
key.append("T");
if (keyNumber == 20)
key.append("U");
if (keyNumber == 21)
key.append("V");
if (keyNumber == 22)
key.append("W");
if (keyNumber == 23)
key.append("X");
if (keyNumber == 24)
key.append("Y");
if (keyNumber == 25)
key.append("Z");
}
return;
}
// "makeFile" function to produce the desired text file.
// Note this only works as intended if you include the ".txt" extension,
// and that a file of the same name doesn't already exist.
void makeFile(string fileName, int n) {
ofstream ourFile;
ourFile.open(fileName);
int k; // For use in below loop to compare with n.
int l; // For use in the loop inside the below loop.
for (k = 1; k <= n; k++) {
for (l = 0; l < 8; l++) { // To write to the file ONE key
ourFile << key[l]; // C++ only lets me do it this way...
}
ourFile << " " << k << "\n"; // Writes two spaces and the data value
}
}
// Primary function to create our desired file!
void mainFunction(string fileName, int n) {
makeKey();
makeFile(fileName, n);
}
int main() {
mainFunction("file.txt", 3); // To test program
cin.get();
return 0;
}
我尝试在第一部分使用srand ( time(NULL) );
和srand (1);
,但这对我也不起作用。
答案 0 :(得分:1)
每次拨打makeKey
时,它会在key
的末尾添加8个字符,但您永远不会清除之前的内容,并在调用makeKey
后打印出前8个字符,没有改变。
我将摆脱全局变量key
,并且makeKey
每次调用时都会返回一个(新创建的)std::string
。
FWIW,我还要重写makeKey
,通过索引到一个char数组,将数字转换为字母。
编辑(响应问题中的编辑):是的,您可能还想在程序开头使用srand(time(NULL));
。 srand(1);
就像你根本不打电话给srand
一样。每次运行程序时,使用srand(time(NULL));
通常应该给出不同的结果序列(除非你运行两次这么快,以至于系统时钟之间没有变化 - 通常在同一秒内两次)。
现在你得到一个重复8次的字符串。修复上面提到的问题将为您提供8种不同的字符串 - 但是如果不使用srand(time(NULL));
,您将在运行程序时获得相同的8个字符串组。如果你只是添加srand(time(NULL));
并且不修复其余部分,你会得到一个字符串8次,但每次运行程序时它会是一个不同的字符串(而现在,即使是一个字符串你get将与您运行该程序的每一次相同。)