python'da rastgele tohum programı çapında ayarla


84

randomModüldeki fonksiyonları farklı dosyalarda kullandığım oldukça büyük bir programım var . Programın her zaman aynı sonuçları döndürmesini sağlamak için rastgele tohumu tek bir yerde bir kez ayarlayabilmek istiyorum. Bu, içinde başarılabilir pythonmi?

Yanıtlar:


122

Çalıştırmalı import randomve çağıran ana python modülü random.seed(n)- bu, randombaşka bir yerde tohumu sıfırlamadığı sürece diğer tüm içe aktarmalar arasında paylaşılır .


3
Tohumu bilmeden bir yere sıfırlayabilir miyim? çünkü tohumu ana dosyaya bir kez yerleştirmek işe yaramaz
Mischa Obrecht

1
@MischaObrecht Öyle sanırım - tohum yalnızca rastgele modülün ilk içe aktarılmasında başlatılır - birden fazla içe aktarılırsa, başlatmayı gerçekleştirmez ve tohumu sıfırlamaz - bu nedenle kodunuzun herhangi bir yerinde açık bir çağrı olmalıdır
Jon Clements

3
randomModül seviyesi kodundan, esas olarak içe aktardığınız yöntemleri çağırıyorsanız , ana içeriğe ulaşmadan önce random.seed(n), bu çağrılar tohumdan önce yapılacaktır ve bu nedenle zaman tohumlamalı ve etkili bir şekilde yeniden üretilemez. rastgele.
Russell Borogove

13
Bazı üçüncü taraf kodlarının RNG'yi yeniden beslediği ortaya çıkarsa (olası değildir, ancak mümkün), random.Random()kurucu aracılığıyla bağımsız duruma sahip ek rastgele sayı üreteçleri oluşturabileceğinizi ve bunları sıkı tekrarlanabilirliğin önemli olduğu durumlarda kullanabileceğinizi unutmayın.
Russell Borogove

Bu benim için çalışmıyor. Ve yeniden üretilebilir bir kodum yok. Tahminimce aktarılan tüm kitaplıkların belgelerini kontrol etmem gerekecek ... (bkz. Stackoverflow.com/questions/37886997/…
B Furtado

36

zss'nin yorumu gerçek bir cevap olarak vurgulanmalıdır:

İnsanların dikkat etmesi gereken başka bir şey: kullanıyorsanız numpy.random, o zaman numpy.random.seed()tohumu ayarlamak için kullanmanız gerekir . Kullanmak random.seed(), kaynaklı rastgele sayılar için tohum ayarlamaz numpy.random. Bu bir süre kafamı karıştırdı. -zss


Kesinlikle doğru, Eğer uygulamanızda bir yerde rasgele sayılar kullanıyorsanız random module, fonksiyon diyelim random.choices()ve daha sonra başka bir noktada numpyrasgele sayı üreteci, diyelim ki np.random.normal()her iki modül için tohumu ayarlamanız gerekiyor. Ne ben genellikle do my içinde birkaç satır sahip olmaktır main.pybeğendiniz random.seed(my_seed)ve np.random.seed(my_seed). Kudos to zss
Aenaon

Sage'in benzer bir sorunu var çünkü PRNG'si hem Python hem de numpy'den farklı. set_random_seed()Adaçayı için kullanın .
Brent Baccala

8

Başvurunuzun başında, random.seed(x)x'in her zaman aynı olduğundan emin olun. Bu, sözde rasgele sayı dizisinin uygulamanın her çalışması sırasında aynı olmasını sağlayacaktır.


3

Jon Clements hemen hemen soruma cevap veriyor. Ancak asıl sorun bu değildi: Görünüşe göre kodumun rasgeleliğinin nedeni numpy.linalg SVD idi çünkü kötü koşullandırılmış matrisler için her zaman aynı sonuçları üretmiyor !!

Bu nedenle, aynı sorunları yaşıyorsanız, kodunuzda bunu kontrol ettiğinizden emin olun!


23
İnsanların dikkat etmesi gereken başka bir şey: numpy.random kullanıyorsanız, tohumu ayarlamak için numpy.random.seed () kullanmanız gerekir. Random.seed () kullanmak numpy.random'dan üretilen rastgele sayılar için tohum ayarlamaz. Bu bir süre kafamı karıştırdı.
zss

1

Önceki yanıtlara dayanarak: tüm tohumlar kontrol edildiğinde bile birçok yapının yürütme yollarını birbirinden ayırabileceğinin farkında olun.

" Ben tohumlarımı hep aynı olacak şekilde ayarladım ve değişen / harici bağımlılıklarım yok, bu nedenle kodumun çalışma yolu her zaman aynı olmalı " diye düşünüyordum, ama bu yanlış.

Beni ısıran örnek list(set(...)), ortaya çıkan sıranın farklı olabileceği yerdi.


İyi nokta, bu beni daha önce yaktı. Ayrıca bir
db'den

0

Önemli bir uyarı, 3.7'den önceki python sürümleri için Sözlük anahtarlarının belirleyici olmamasıdır. Bu, programda rastgeleliğe veya hatta rastgele sayıların üretildiği farklı bir sıraya ve dolayısıyla deterministik olmayan rasgele sayılara yol açabilir. Sonuç güncelleme python.


-14

Kendi rastgele sayı oluşturucunuzu kullanarak bunu oldukça kolay bir şekilde garanti edebilirsiniz.

Sadece üç büyük asal seçin (bunun bir kriptografi uygulaması olmadığını varsayarak) ve bunları a, b ve c'ye ekleyin: a = ((a * b)% c) Bu oldukça rastgele veriler üreten bir geri bildirim sistemi verir. Tüm asal sayıların eşit derecede iyi çalışmadığını unutmayın, ancak sadece bir simülasyon yapıyorsanız, önemli olmamalıdır - çoğu simülasyon için gerçekten ihtiyacınız olan tek şey, yeterince karmaşık bir modele (sözde rasgele, hatırlayın) sahip bir sayı karmakarışıklığıdır. başvurunuzla bir şekilde uyuşmuyor.

Knuth bundan bahsediyor.


10
Python'un standart kitaplığında mükemmel rasgele sayı olanakları bulunduğundan, kendinizinkini çevirmek gereksizdir ve ne yaptığınızı bilmiyorsanız gerçekten kötü bir jeneratör oluşturmak çok kolaydır.
Russell Borogove

6
Bunun oldukça kötü bir çözüm olduğuna katılıyorum: Genellikle milyonlarca örnek toplayan Monte Carlo simülasyonlarında (benim programım budur), ilişkili rastgele sayılar (kötü bir jeneratörden kaynaklanan) sonuçlarınızı kolayca bozabilir !!
Mischa Obrecht

Yani, Knuth her zaman bundan mı bahsediyor? Şimdi bile?
vasıta-to-anlam
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.