Sinh ra N chuỗi ký tự, mỗi chuỗi độ dài M, từ một chuỗi gốc cho trước. Các ký tự trong mỗi chuỗi sinh ra không được trùng lặp.
Thuật toán
Hàm GenerateSequence(base, n, len, output):
Với i từ 0 đến n-1:
Nếu i == 0: lấy ký tự ngẫu nhiên từ base.
Ngược lại:
Sinh chỉ số ngẫu nhiên in.
Nếu base[in] đã có trong output: sinh lại (goto).
Thêm base[in] vào output.
Kết thúc chuỗi bằng '\0'.
Ví dụ mã nguồn
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
void GenerateSequence(char base[], int n, int len, char* output) {
for (int i = 0; i < n; i++) {
if (i == 0)
output[i] = base[rand() % len];
else {
int in;
retry:
in = rand() % len;
for (int k = 0; k < i; k++)
if (base[in] == output[k]) goto retry;
output[i] = base[in];
}
}
output[n] = '\0';
}
int main() {
char base[100];
int numStr, strLen;
cout << "Chuoi goc: "; cin >> base;
cout << "So chuoi can sinh: "; cin >> numStr;
cout << "Do moi chuoi: "; cin >> strLen;
int len = strlen(base);
for (int i = 0; i < numStr; i++) {
char seq[strLen+1];
GenerateSequence(base, strLen, len, seq);
cout << "Chuoi " << i+1 << ": " << seq << endl;
}
return 0;
}
Đầu ra mẫu
Chuoi goc: tutorialspoint So chuoi can sinh: 7 Do moi chuoi: 6 Chuoi 1: tuanol Chuoi 2: itlurp Chuoi 3: tonaiu Chuoi 4: untlri Chuoi 5: liorpt Chuoi 6: liusto Chuoi 7: luisot