Hãy xem SQL Server - Đặt các số ngẫu nhiên dựa trên có giải thích rất chi tiết.
Tóm lại, đoạn mã sau tạo một số ngẫu nhiên trong khoảng từ 0 đến 13, bao gồm một phân phối thống nhất:
ABS(CHECKSUM(NewId())) % 14
Để thay đổi phạm vi của bạn, chỉ cần thay đổi số ở cuối biểu thức. Cẩn thận hơn nếu bạn cần một phạm vi bao gồm cả số dương và số âm. Nếu bạn làm sai, có thể nhân đôi số 0.
Một cảnh báo nhỏ cho các hạt toán học trong phòng: có một sai lệch rất nhỏ trong mã này. CHECKSUM()
dẫn đến các số thống nhất trong toàn bộ phạm vi của kiểu dữ liệu Int sql, hoặc ít nhất là gần như thử nghiệm của tôi (trình soạn thảo) có thể hiển thị. Tuy nhiên, sẽ có một số sai lệch khi CHECKSUM () tạo ra một số ở đầu cuối của phạm vi đó. Bất cứ khi nào bạn nhận được một số giữa số nguyên tối đa có thể và bội số chính xác cuối cùng của kích thước của phạm vi mong muốn của bạn (14 trong trường hợp này) trước số nguyên tối đa đó, các kết quả đó được ưu tiên trên phần còn lại của phạm vi không thể được tạo từ bội số cuối cùng của 14.
Ví dụ, hãy tưởng tượng toàn bộ phạm vi của kiểu Int chỉ 19. 19 là số nguyên lớn nhất có thể bạn có thể giữ. Khi CHECKSUM () kết quả trong 14-19, những kết quả này tương ứng với kết quả 0-5. Những con số này sẽ được rất nhiều ưu ái hơn 6-13, vì checksum () là gấp đôi khả năng để tạo ra chúng. Thật dễ dàng để chứng minh điều này một cách trực quan. Dưới đây là toàn bộ tập hợp kết quả có thể có cho phạm vi số nguyên tưởng tượng của chúng tôi:
Số nguyên kiểm tra: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
Phạm vi Kết quả: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 0 1 2 3 4 5
Bạn có thể thấy ở đây có nhiều cơ hội để tạo ra một số con số hơn những con số khác: thiên vị. Rất may, phạm vi thực tế của loại Int lớn hơn nhiều ... đến mức trong hầu hết các trường hợp, độ lệch gần như không thể phát hiện được. Tuy nhiên, đó là điều cần lưu ý nếu bạn thấy mình làm điều này vì mã bảo mật nghiêm trọng.