Sürekli olarak aynı rasgele uyuşmuş diziyi oluşturun


91

Başka bir geliştiricinin -1,0 veya 1 değerlerine sahip bir np şekil dizisi (100,2000) döndürecek bir kod parçasını bitirmesini bekliyorum.

Bu arada, geliştirme ve testime bir adım önde başlamak için aynı özelliklerden rastgele bir dizi oluşturmak istiyorum. Mesele şu ki, bu rastgele oluşturulmuş dizinin her seferinde aynı olmasını istiyorum, böylece sürecimi her yeniden çalıştırdığımda değerini değiştiren bir diziye karşı test etmiyorum.

Dizimi bu şekilde oluşturabilirim, ancak her seferinde aynı olacak şekilde onu yaratmanın bir yolu var mı? Nesneyi toparlayıp, çözebilirim, ama başka bir yolu var mı diye merak ediyorum.

r = np.random.randint(3, size=(100, 2000)) - 1

Yanıtlar:


87

Rastgele sayı üretecini sabit bir değerle tohumlayın, örn.

numpy.random.seed(42)

Bu şekilde, her zaman aynı rastgele sayı dizisini elde edersiniz.

Bu işlev, genel varsayılan rasgele sayı üretecini başlatır ve içindeki bir işleve yapılan herhangi bir çağrı, numpy.randomdurumunu kullanır ve değiştirir. Bu, birçok basit kullanım durumu için iyidir, ancak küresel devletin getirdiği tüm sorunların olduğu bir küresel devlet biçimidir. Daha temiz bir çözüm için aşağıdaki Robert Kern'in cevabına bakın.


43
numpy.random.seed()Ben dikkat etmediğimde biri işleve gizlice girdi . :-) Kasıtlı olarak orijinal modülün dışında bıraktım. İnsanların kendi örneklerini kullanmalarını RandomStateve bu nesnelerin etrafından dolaşmalarını tavsiye ederim .
Robert Kern

6
Robert, numpy'nin en büyük katkılarından biridir. Bence fikrine biraz ağırlık vermeliyiz.
kullanımdan kaldırıldı

11
@deprecated: Robert'ın çalışmaları için müteşekkirim, ancak yaptığı çalışmalar, tavsiye için bir mantık sunmanın yerini tutmuyor. Ayrıca, kullanımı tavsiye edilmezse numpy.random.seed(), bu dokümantasyonda belirtilmelidir . Görünüşe göre NumPy'ye katkıda bulunan diğer kişiler Robert'ın fikrini paylaşmıyor. Kasıtlı bir suç yok, sadece merak ediyorum.
Sven Marnach

13
Bu, Python standart kitaplığında random.seedbir random.Randomnesneyi kullanmakla aynı şeydir. random.seedVeya kullanırsanız , hem kodunuzda hem de aradığınız herhangi bir kodda veya sizinki ile aynı oturumda çalıştırılan herhangi bir kodda tüm rastgele örnekleri numpy.random.seedtohumlamış olursunuz. Bu şeyler aslında rastgele olan şeylere bağlıysa, o zaman sorunlarla karşılaşmaya başlarsınız. Rastgele tohumu ayarlayan bir kod dağıtırsanız, bir güvenlik açığı ortaya çıkarabilirsiniz.
asmeurer

3
@asmeurer Güvenlik amacıyla sözde rasgele sayı üreteci kullanan herkes muhtemelen ne yaptığını bilmiyordur.
JAB

191

numpy.random.RandomState()Seçtiğiniz tohumla kendi örneğinizi oluşturun . numpy.random.seed()Kendi RandomStateörneğinizin etrafından geçmenize izin vermeyen esnek olmayan kitaplıklarda çalışmak dışında kullanmayın .

[~]
|1> from numpy.random import RandomState

[~]
|2> prng = RandomState(1234567890)

[~]
|3> prng.randint(-1, 2, size=10)
array([ 1,  1, -1,  0,  0, -1,  1,  0, -1, -1])

[~]
|4> prng2 = RandomState(1234567890)

[~]
|5> prng2.randint(-1, 2, size=10)
array([ 1,  1, -1,  0,  0, -1,  1,  0, -1, -1])

7
Tavsiyeniz için herhangi bir gerekçeniz var mı? Neyin var numpy.random.seed()? İş parçacığı için güvenli olmadığını biliyorum, ancak iş parçacığı güvenliğine ihtiyacınız yoksa gerçekten kullanışlı.
Sven Marnach

52
Çoğunlukla iyi alışkanlıklar oluşturmaktır. Şu anda bağımsız yayınlara ihtiyacınız olmayabilir, ancak şu andan itibaren Sven-6 aylık olabilir. Kitaplıklarınızı yöntemleri doğrudan kullanmak için numpy.randomyazarsanız, daha sonra bağımsız akışlar oluşturamazsınız. Kontrollü PRNG akışlarına sahip olmak amacıyla kitaplıklar yazmak da daha kolaydır. Kitaplığınıza girmenin her zaman birden fazla yolu vardır ve her birinin tohumu kontrol etmenin bir yolu olmalıdır. PRNG nesnelerinin etrafından dolaşmak, bunu yapmanın güvenmekten daha temiz bir yoludur numpy.random.seed(). Ne yazık ki, bu yorum kutusu daha fazla örnek içeremeyecek kadar kısa. :-)
Robert Kern

25
Robert'ın mantığını açıklamanın başka bir yolu: numpy.random.seed'i kullanmak, PRNG durumunu korumak için global bir değişken kullanır ve global değişkenlerin kötü olduğu aynı standart nedenler burada da geçerlidir.
Robie Başak

9
PRNG'lerin bağımsız olmasını istiyorsanız, onları hiçbir şeyle tohumlamayın. Sadece numpy.random.RandomState()argüman olmadan kullanın . Bu, bu tür şeyler için işletim sistemi tesislerinizden alınan benzersiz değerlerle durumu tohumlayacaktır ( /dev/urandomUNIX makinelerinde ve oradaki Windows eşdeğerinde). İşinize numpy.random.RandomState(1234567890)yaramıyorsa, lütfen tam olarak ne yazdığınızı ve aldığınız hata mesajını tam olarak gösterin.
Robert Kern

5
İyi bir fikir değil. numpy.random.RandomState()En iyi sonuçlar için bağımsız değişken olmadan kullanın .
Robert Kern

3

Rastgele bir duruma dayanan başka işlevler kullanıyorsanız, yalnızca genel bir çekirdek ayarlayamazsınız, bunun yerine rasgele sayı listenizi oluşturmak için bir işlev oluşturmalı ve çekirdeği işlevin bir parametresi olarak ayarlamalısınız. Bu, koddaki diğer rastgele oluşturucuları rahatsız etmeyecektir:

# Random states
def get_states(random_state, low, high, size):
    rs = np.random.RandomState(random_state)
    states = rs.randint(low=low, high=high, size=size)
    return states

# Call function
states = get_states(random_state=42, low=2, high=28347, size=25)

3

Bir rastgele üretecin tohumunun ne olduğunu ve kodunuzda ne zaman / nasıl ayarlandığını anlamak önemlidir (örneğin , tohumun matematiksel anlamının güzel bir açıklaması için burayı kontrol edin ).

Bunun için aşağıdakileri yaparak tohumu ayarlamanız gerekir:

random_state = np.random.RandomState(seed=your_favorite_seed_value)

Bu durumda, rastgele sayıları np.random'dan değil, random_state'den üretmek önemlidir. Yani yapmalısın:

random_state.randint(...)

onun yerine

np.random.randint(...) 

yeni bir RandomState () örneği yaratacak ve temelde tohumu ayarlamak için bilgisayarınızın dahili saatini kullanacaktır.


2

Sadece net olmayan bir durumda @Robert Kern cevabı ile ilgili bir şeyi açıklığa kavuşturmak istiyorum. Kullanmak yapsan bile RandomStatebunu aksi takdirde aşağıdaki sonuçlar alırsınız Robert'ın örnekte olduğu gibi bir numpy rastgele yöntemini çağırın her zaman başlatmak zorunda kalacaktı.

Python 3.6.9 |Anaconda, Inc.| (default, Jul 30 2019, 19:07:31) 
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> prng = np.random.RandomState(2019)
>>> prng.randint(-1, 2, size=10)
array([-1,  1,  0, -1,  1,  1, -1,  0, -1,  1])
>>> prng.randint(-1, 2, size=10)
array([-1, -1, -1,  0, -1, -1,  1,  0, -1, -1])
>>> prng.randint(-1, 2, size=10)
array([ 0, -1, -1,  0,  1,  1, -1,  1, -1,  1])
>>> prng.randint(-1, 2, size=10)
array([ 1,  1,  0,  0,  0, -1,  1,  1,  0, -1])
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.