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 ra một số ngẫu nhiên từ 0 đến 13 với phân phối đồng đều:
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. Hãy hết sức cẩn thậ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, bạn có thể đếm hai lần số 0.
Một cảnh báo nhỏ cho những người mê toán trong phòng:có một sự thiên vị rất nhỏ trong mã này. CHECKSUM()
kết quả là những con số đồng nhất trên toàn bộ phạm vi của kiểu dữ liệu sql Int, hoặc ít nhất là gần như thử nghiệm của tôi (người chỉnh sửa) 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 trên cùng của phạm vi đó. Bất kỳ 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 phạm vi mong muốn của bạn (trong trường hợp này là 14) trước số nguyên tối đa đó, những kết quả đó sẽ được ưu tiên hơn phần còn lại của phạm vi mà bạn không thể tạo ra 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ỉ là 19. 19 là số nguyên lớn nhất có thể mà bạn có thể nắm giữ. Khi CHECKSUM () cho kết quả là 14-19, các kết quả này tương ứng với kết quả 0-5. Những con số đó sẽ nặng nề được ưa chuộng hơn 6-13, vì CHECKSUM () có khả năng tạo chúng cao gấp đôi. Sẽ dễ dàng hơn để 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 các kết quả có thể có cho phạm vi số nguyên tưởng tượng của chúng tôi:
Checksum Integer:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19Range Kết quả:0 1 2 3 4 5 6 7 8 9 10 11 12 13 0 1 2 3 4 5Bạn có thể thấy ở đây rằng có nhiều cơ hội để tạo ra một số con số hơn những con số khác:độ lệch. Rất may, phạm vi thực tế của loại Int là nhiều 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 từng thấy mình làm điều này vì mã bảo mật nghiêm trọng.