Lihatlah SQL Server - Tetapkan nomor acak berbasis yang memiliki penjelasan yang sangat rinci.
Untuk meringkas, kode berikut menghasilkan angka acak antara 0 dan 13 termasuk 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 kacang matematika di ruangan: ada sedikit bias dalam kode ini. CHECKSUM()
menghasilkan angka yang seragam di seluruh jajaran datatype sql Int, atau setidaknya sedekat yang dapat ditunjukkan oleh pengujian (editor) saya. Namun, akan ada beberapa bias ketika CHECKSUM () menghasilkan angka di bagian 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-hasil itu 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 bisa Anda pegang. Ketika CHECKSUM () menghasilkan 14-19, ini sesuai dengan hasil 0-5. Angka-angka itu akan sangat disukai di atas 6-13, karena CHECKSUM () dua kali lebih mungkin menghasilkannya. Lebih mudah untuk menunjukkan ini secara visual. Di bawah ini adalah seluruh rangkaian hasil yang mungkin untuk rentang integer imajiner kami:
Integer Checksum: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
Hasil Rentang: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 0 1 2 3 4 5
Anda dapat melihat di sini bahwa ada lebih banyak peluang untuk menghasilkan beberapa angka daripada yang lain: bias. Untungnya, kisaran sebenarnya dari tipe Int jauh lebih besar ... begitu banyak sehingga dalam kebanyakan kasus biasnya hampir tidak terdeteksi. Namun, ini adalah sesuatu yang harus diperhatikan jika Anda menemukan diri Anda melakukan ini untuk kode keamanan serius.