Tài trợ bài viết này và giới thiệu dịch vụ, sản phẩm, thương hiệu, nhu cầu tuyển dụng của doanh nghiệp đến với cộng đồng.
Bùi Thị Mỹ Tiên Giải thuật random chuỗi ngẫu nhiên được ứng dụng trong việc tạo mã ngẫu nhiên như password, mã dự thưởng. Có thể sử dụng giải thuật sinh chuỗi ngẫu nhiên này với các ngôn ngữ lập trình khác như C++, Python, C#, Java, JavaScript.
Nội dung bài viết

Giới thiệu

Sinh ra chuỗi ngẫu nhiên rất cần trong các sản phẩm như tạo ra mã sản phẩm, mã dự thưởng hoặc mã kiểm soát, đề xuất password ngẫu nhiên. Trong giới hạn bài viết này là giải thuật cơ bản, bạn có thể cải tiến thêm để phục vụ đúng nhu cầu như: sinh hàng loạt mã ngẫu nhiên không trùng nhau hoặc cải tiến cho trường hợp sử dụng các ký tự Unicode.

Tiền đề bài viết

Bài viết ra đời với đơn thuần là tôi muốn thử nghiệm làm 1 điều gì mới hơn ngoài việc học và học cách liên kết các kiến thức của mình để mang lại giá trị.

Đối tượng hướng đến

  • Áp dụng cho các công việc cụ thể như sinh mã, phù hợp với các đối tượng tìm kiếm các giải pháp tương tự.
    • In ấn mã dự thưởng.
    • In ấn mã chống hàng giả.
    • Đề xuất password trong các phần mềm.
  • Dành cho các học viên STDIO Training tham khảo thêm kiến thức và kinh nghiệm.

Giải thuật

Xác định tập hợp các kí tự và số bạn muốn xuất hiện trong chuỗi ngẫu nhiên. Trong bài viết này tôi 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 bạn mong muốn (n lần), 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';
}
  • code là tham số 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 mà ta 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 đầ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;
}

Download mã nguồn

Mã nguồn Sinh chuỗi ngẫu nhiên (Random chuỗi) các bạn có thể download tại đây.

Tham khảo

Random Số Trong C++

THẢO LUẬN
ĐÓNG