Ruby'de Rasgele Sayılar Nasıl Oluşturulur

Hiçbir bilgisayar gerçekten rastgele sayılar üretemezken, Ruby geri dönecek bir yönteme erişim sağlar Yalancı rasgele sayılar.

Hiçbir bilgisayar gerçekten üretemez rastgele sayılar tamamen hesaplama ile. Yapabilecekleri en iyi şey, Yalancı rasgele sayılar. görünmek rastgele ama değil.

Bir insan gözlemci için bu sayılar gerçekten rastgeledir. Kısa tekrar eden diziler olmayacak ve en azından insan gözlemciye net bir örüntü sunmayacaklar. Ancak, yeterli zaman ve motivasyon verildiğinde, orijinal tohum keşfedilebilir, dizi yeniden oluşturulur ve dizideki bir sonraki sayı tahmin edilir.

Bu nedenle, bu makalede tartışılan yöntemler, kriptografik olarak güvenli olması gereken sayıları üretmek için kullanılmamalıdır.

Sahte sayı üreteçleri seribaşı yeni bir rasgele sayı üretildiğinde her seferinde farklı diziler üretmek için. Hiçbir yöntem büyülü değildir - görünüşte rastgele sayılar nispeten basit algoritmalar ve nispeten basit aritmetik kullanılarak üretilir. PRNG'yi ekerek, her seferinde farklı bir noktada başlatıyorsunuz. Eğer tohumlamadıysanız, her seferinde aynı sayı dizisini üretecektir.

instagram viewer

Ruby'de, Çekirdek # srand yöntemi argüman olmadan çağrılabilir. Zamana, işlem kimliğine ve sıra numarasına göre rastgele bir sayı tohumu seçecektir. Sadece arayarak srand programınızın başlangıcında herhangi bir yerde, her çalıştırdığınızda farklı rastgele görünen sayılar dizisi oluşturur. Bu yöntem, program başlatıldığında örtük olarak çağrılır ve PRNG'yi zaman ve işlem kimliğiyle tohumlar (sıra numarası yok).

Program çalıştıktan sonra ve Çekirdek # srand örtük veya açık bir şekilde çağrıldı, Çekirdek # Rand yöntemi çağrılabilir. Bağımsız değişken olmadan çağrılan bu yöntem 0 ile 1 arasında rastgele bir sayı döndürür. Geçmişte, bu sayı genellikle oluşturmak istediğiniz maksimum sayıya ölçeklendirildi ve belki de to_i bir tamsayıya dönüştürmek için çağırdı.

Ancak, Ruby 1.9.x kullanıyorsanız, Ruby işleri biraz daha kolaylaştırır. Çekirdek # Rand yöntemi tek bir argüman alabilir. Bu argüman bir Sayısal herhangi bir tür olursa, Ruby 0'dan bu sayıya kadar (ve içermeyen) bir tamsayı oluşturur.

Ancak, 10'dan 15'e kadar bir sayı oluşturmak isterseniz ne olur? Genellikle, 0 ile 5 arasında bir sayı oluşturur ve 10'a eklersiniz. Ancak Ruby bunu kolaylaştırır.

İki tür aralığa dikkat ettiğinizden emin olun. Aradıysanız rand (10..15), bu 10'dan 15'e kadar bir sayı oluşturur dahil olmak üzere 15. Buna karşılık rand (10... 15) (3 noktalı) 10 ile 15 arasında bir sayı oluşturur içermiyor 15.

Bazen rastgele görünen bir sayı dizisine ihtiyacınız vardır, ancak her seferinde aynı diziyi oluşturmanız gerekir. Örneğin, bir birim testinde rastgele sayılar üretiyorsanız, her seferinde aynı sayı dizisini oluşturmalısınız.

Bir sekansta başarısız olan bir birim testi bir sonraki çalıştırıldığında tekrar başarısız olmalıdır, bir dahaki sefere fark sekansı oluşturduysa başarısız olmayabilir. Bunu yapmak için arayın Çekirdek # srand bilinen ve sabit bir değer.

Uygulanması Çekirdek # Rand oldukça yakut değildir. PRNG'yi hiçbir şekilde soyutlamaz veya PRNG'yi başlatmanıza izin vermez. PRNG için tüm kodların paylaştığı tek bir genel durum vardır. Çekirdeği değiştirirseniz veya PRNG'nin durumunu başka bir şekilde değiştirirseniz, beklenenden daha geniş bir etki aralığına sahip olabilir.

Ancak, programlar bu yöntemin sonucunun rastgele olmasını beklediğinden - amacı budur! - bu muhtemelen hiçbir zaman bir sorun olmayacaktır. Yalnızca program, çağrılmış gibi, beklenen bir sayı dizisini görmeyi beklerse srand sabit bir değere sahipse, beklenmedik sonuçlar görürse.