Giải thuật
Xác định tập hợp các kí tự và số muốn xuất hiện trong chuỗi ngẫu nhiên. Trong bài viết này sẽ chọn tập hợp (R) gồm các kí tự a-z, A-Z và 0-9.
Chọn 1 ký tự ngẫu nhiên trong R: việc lấy ngẫu nhiên một kí tự thuộc R thực chất là chọn ngẫu nhiên một vị trí (index) trong tập R. Giả sử tập R có n phần tử, mỗi phần tử được đánh số từ 0 → (n - 1), suy ra miền giá trị của index là [0 ... (n – 1)].
Tùy vào độ dài chuỗi ngẫu nhiên cần sinh theo yêu cầu (n ký tự) mà lặp lại n lần chọn ký tự ngẫu nhiên như trên.
Hiện thực
Hàm sinh chuỗi ngẫu nhiên
void RandomStringGenerator(char* code, int codeLength) { char* box = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefjhijklmnopqrstuvwxyz0123456789"; int boxLength = strlen(box); for (int i = 0; i < codeLength; i++) { code[i] = box[rand() % boxLength]; } code[codeLength] = '\0'; }
Trong đó:
- code là mảng để lưu chuỗi ngẫu nhiên được sinh ra.
- codeLength là tham số chỉ định độ dài chuỗi ngẫu nhiên mong muốn.
- box mang ý nghĩa là những ký tự sẽ xuất hiện trong chuỗi ngẫu nhiên. Ví dụ box có 5 ký tự abcde thì kết quả của code được sinh ra chỉ nằm trong phạm vi các ký tự này. Nếu bạn muốn chuỗi trả về có thêm các ký tự đặc biệt như !@#$%^..., bạn có thể tự thêm vào chuỗi box.
Code chương trình sinh chuỗi đầy đủ và cách sử dụng
Cho cả 2 trường hợp cấp phát động và cấp phát tĩnh cho chuỗi ngẫu nhiên.
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <time.h> void RandomStringGenerator(char* code, int codeLength) { char* box = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefjhijklmnopqrstuvwxyz0123456789"; int boxLength = strlen(box); for (int i = 0; i < codeLength; i++) { code[i] = box[rand() % boxLength]; } code[codeLength] = '\0'; } int main() { srand(time(0)); int length1 = 6; char code1[6 + 1]; RandomStringGenerator(&code1[0], length1); printf("%s\n", code1); int length2 = 8; char* code2 = new char[length2 + 1]; RandomStringGenerator(code2, length2); printf("%s\n", code2); delete[]code2; return 0; }
Hoặc có thể download code đầy đủ giải thuật sinh chuỗi ngẫu nhiên tại đây.