ลองดูที่SQL Server - ตั้งค่าตัวเลขสุ่มซึ่งมีคำอธิบายอย่างละเอียด
เพื่อสรุปรหัสต่อไปนี้สร้างตัวเลขสุ่มระหว่าง 0 และ 13 รวมกับการกระจายสม่ำเสมอ:
ABS(CHECKSUM(NewId())) % 14
หากต้องการเปลี่ยนช่วงของคุณเพียงแค่เปลี่ยนจำนวนที่ส่วนท้ายของนิพจน์ ระมัดระวังเป็นพิเศษหากคุณต้องการช่วงที่มีทั้งจำนวนบวกและลบ หากคุณทำผิดอาจเป็นไปได้ที่จะนับจำนวน 0 เป็นสองเท่า
คำเตือนเล็กน้อยสำหรับคณิตศาสตร์ถั่วในห้อง: มีอคติเล็กน้อยในรหัสนี้ CHECKSUM()
ผลลัพธ์เป็นตัวเลขที่มีความเหมือนกันในทุกช่วงของประเภทข้อมูล sql Int หรืออย่างน้อยก็ใกล้เคียงดังนั้นการทดสอบของฉัน (ตัวแก้ไข) สามารถแสดงได้ อย่างไรก็ตามจะมีอคติเมื่อ CHECKSUM () สร้างตัวเลขที่ปลายบนสุดของช่วงนั้น เมื่อใดก็ตามที่คุณได้รับตัวเลขระหว่างจำนวนเต็มสูงสุดที่เป็นไปได้และคูณกับขนาดของช่วงที่คุณต้องการ (14 ในกรณีนี้) ก่อนจำนวนเต็มที่สูงสุดผลลัพธ์เหล่านั้นจะได้รับการสนับสนุนเหนือส่วนที่เหลือของช่วงที่คุณไม่สามารถสร้างได้ ผลคูณของ 14
ยกตัวอย่างเช่นสมมติว่าช่วงทั้งหมดของชนิด Int มีค่าเพียง 19. 19 เป็นจำนวนเต็มที่เป็นไปได้ที่คุณสามารถเก็บได้ เมื่อ CHECKSUM () ส่งผลใน 14-19 สิ่งเหล่านี้จะสอดคล้องกับผลลัพธ์ 0-5 ตัวเลขเหล่านั้นจะได้รับความนิยมอย่างมากในช่วงอายุ 6-13 ปีเพราะ CHECKSUM () เป็นสองเท่าที่จะสร้าง มันง่ายกว่าที่จะแสดงให้เห็นด้วยสายตา ด้านล่างเป็นชุดผลลัพธ์ที่เป็นไปได้ทั้งหมดสำหรับช่วงจำนวนเต็มในจินตนาการของเรา:
Checksum จำนวนเต็ม: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
ช่วงผลลัพธ์: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 0 1 2 3 4 5
คุณจะเห็นได้ว่ามีโอกาสที่จะสร้างตัวเลขได้มากกว่าคนอื่น ๆ : อคติ โชคดีที่ช่วงที่แท้จริงของชนิด int เป็นมากขนาดใหญ่ ... มากดังนั้นในกรณีส่วนใหญ่อคติเกือบ undetectable อย่างไรก็ตามมันเป็นสิ่งที่ควรระวังหากคุณพบว่าตัวเองทำเช่นนี้เพื่อความปลอดภัย