Lihatlah SQL Server - Setel angka acak berbasis yang memiliki penjelasan yang sangat rinci.
Untuk meringkas, kode berikut menghasilkan angka acak antara 0 dan 13 inklusif dengan distribusi seragam:
ABS(CHECKSUM(NewId())) % 14
Untuk mengubah rentang Anda, cukup ubah angka di akhir ekspresi. Berhati-hatilah jika Anda membutuhkan rentang yang mencakup angka positif dan negatif. Jika Anda salah melakukannya, Anda dapat menghitung dua kali angka 0.
Peringatan kecil untuk orang gila matematika di ruangan:ada sedikit bias dalam kode ini. CHECKSUM()
menghasilkan angka yang seragam di seluruh rentang tipe data sql Int, atau setidaknya sedekat yang dapat ditunjukkan oleh pengujian saya (editor). Namun, akan ada beberapa bias ketika CHECKSUM() menghasilkan angka di ujung paling atas dari rentang itu. Setiap kali Anda mendapatkan angka antara bilangan bulat maksimum yang mungkin dan kelipatan tepat terakhir dari ukuran rentang yang Anda inginkan (14 dalam kasus ini) sebelum bilangan bulat maksimum itu, hasil tersebut lebih disukai daripada bagian sisa rentang Anda yang tidak dapat dihasilkan dari kelipatan terakhir dari 14.
Sebagai contoh, bayangkan seluruh rentang tipe Int hanya 19. 19 adalah bilangan bulat terbesar yang dapat Anda pegang. Ketika CHECKSUM() menghasilkan 14-19, ini sesuai dengan hasil 0-5. Angka-angka itu akan berat disukai lebih dari 6-13, karena CHECKSUM() dua kali lebih mungkin untuk menghasilkannya. Lebih mudah untuk menunjukkan ini secara visual. Di bawah ini adalah seluruh rangkaian hasil yang mungkin untuk rentang bilangan bulat imajiner kami:
Checksum Integer:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19Range Hasil:0 1 2 3 4 5 6 7 8 9 10 11 12 13 0 1 2 3 4 5Anda dapat melihat di sini bahwa ada lebih banyak peluang untuk menghasilkan beberapa angka daripada yang lain:bias. Untungnya, kisaran sebenarnya dari tipe Int adalah banyak lebih besar... sedemikian rupa sehingga dalam banyak kasus bias hampir tidak terdeteksi. Namun, ini adalah sesuatu yang harus diperhatikan jika Anda pernah melakukan ini untuk kode keamanan yang serius.