SORU
25 HAZİRAN 2009, PERŞEMBE


Nasıl bir TSQL Seçin her satır için rastgele sayı üretmek?

Benim tablodaki her satır için farklı rastgele bir numaraya ihtiyacım var. Görünüşte bariz aşağıdaki kod her satır için aynı rasgele değeri kullanır.

SELECT table_name, RAND() magic_number 
FROM information_schema.tables

Bir İNT ya da bu bir ŞAMANDIRA almak istiyorum. Hikayenin geri kalanını rasgele bir tarih olduğunu bir tarihten itibaren mahsup oluşturmak için rastgele sayı kullanın, örneğin 1-14 gün başlangıç tarihi mahsup edeceğim.

Bu Microsoft SQL Server 2000 için.

CEVAP
25 HAZİRAN 2009, PERŞEMBE


Çok ayrıntılı bir açıklama vardır SQL Server - Set based random numbers bir göz atın.

Özetlemek gerekirse, aşağıdaki kodu normalleştirilmiş bir dağıtım ile arasında 0 ve 13 dahil): rastgele bir sayı üretir

ABS(CHECKSUM(NewId())) % 14

Aralığı değiştirmek için, sadece ifade sonunda numarasını değiştirmek. Eğer ikisi de pozitif ve negatif sayılar içeren bir dizi ihtiyacınız varsa ekstra dikkatli olun. Eğer yanlış yaparsanız, Olası çift sayısı sayısı 0.

Odasında matematik fındık için küçük bir uyarı: bu kod çok hafif bir sapma var. (Editör) benim test olarak sql İnt veri türü, Tüm aralığı boyunca, ya da en azından yakın bir o kadar normalleştirilmiş sayı CHECKSUM() sonuçlar gösterebilir. Ancak, SAĞLAMA toplamı zaman biraz önyargı olacak() bu dizi çok üst sonunda. bir sayı verir Her zaman bir numara arasında mümkün olan en büyük tamsayı ve son kesin birden fazla boyutu istediğiniz aralığı (14 böyle bir durumda önce en büyük tamsayı, bu sonuçlar, tercih geri kalan kısmını aralığı edilemez üretilen son birden çok 14.

Örneğin, İnt türü aralığının tamamını 19 sadece hayal. 19 tutabilir olası en büyük tamsayı. Ne zaman CHECKSUM() sonuçlar 0-5 karşılık bu 14-19, sonuçları. Bu numaraları olurduağırCHECKSUM çünkü 6-13, önceliklidir() onları oluşturmak için iki kat daha muhtemeldir. Kolay görsel olarak göstermek için. Aşağıda hayali tamsayı aralığında sonuçlar tüm olası ayarlayın:

Checksum Integer: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
Range Result:     0 1 2 3 4 5 6 7 8 9 10 11 12 13  0  1  2  3  4  5

Bazı sayılar üretmek için daha fazla şansı var bu işte diğerlerinden daha görebilirsiniz: önyargı. Neyse ki, İnt türü, gerçek aralığıçokbüyük... çok çoğu durumda önyargı neredeyse mümkün değildir. Ancak, eğer hiç, eğer ciddi bir güvenlik kodu için bu yaparken kendinizi bulursanız farkında olmak bir şeydir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Amir Parmar

    Amir Parmar

    25 Kasım 2010
  • Kat Krazy

    Kat Krazy

    12 Kasım 2010
  • Matt Steffanina

    Matt Steffan

    1 EYLÜL 2011