Runif neden her seferinde aynı sonucu üretmiyor?


11

Neden runif()R gibi rastgele sayı üreteçlerinin her seferinde aynı sonucu üretmemesi?

Örneğin:

X <- runif(100)
X

her seferinde farklı çıktılar üretiyor.

Her seferinde farklı çıktılar üretmenin nedeni nedir?

Bunu yapmak için arka planda ne gibi işlevler var?


3
Bunu düşünmenin bir yolu kendinize şu soruyu sormaktır: "rasgele sayı üretecinizin her seferinde aynı sayıları üretmesini ister misiniz?"
shadowtalker

2
@ssdecontrol: Bkz Dilbert
Henry

2
Veya xkcd
Henry

Yanıtlar:


18

Kalbindeki bu gerçekten sadece bir R sorusu değildir; daha genel olarak rastgele sayı üretimi ile ilgilidir.

"Rastgele" sayılar istatistiğin birçok bölümünde çok önemlidir. Belirli özelliklere sahip olmak için ürettiğimiz rastgele değerlere ihtiyacımız var ve (genellikle) rastgele sayı üreteçleri oluşturmak ve özelliklerini kontrol etmek için çok çaba sarf ediyoruz.

Fikir, aslında rastgele sayılar için iyi bir proxy olan bir dizi değer elde etmek istiyoruz. Rasgele sayı üretmenin olağan beyni, eşit dağılımdır (bundan Gauss rasgele sayılar gibi başkalarını inşa ederiz).

Dolayısıyla (en tipik olarak), her biri öncekilerin bazı işlevleri açısından bir tamsayı dizisi oluşturmak için sayısal bir algoritma kullanılır. Bu tamsayılar daha sonra 0 ile 1 (genellikle ) olacak şekilde ölçeklendirilir .[0,1)

Örneğin, birçoğu bir öncekinde çalışır:

x1=f(x0)z1=x1/mx2=f(x1)z2=x2/mx3=f(x2)z3=x3/m

... burada 'in, tamsayılardır z ler sonra birim aralığında olduğu ölçeklendirilir' ve f bit yeni bir dizi üretmek için değişken bit üzerinde faaliyet gösteren bazı çoğu zaman karmaşık ama genellikle hızlı fonksiyonudur (umarım) önceki değerlerle ilgili görünmüyor (eğer onlara gerçekten ilgili olsalar da, her şekilde dikkatlice bakarsak - bu şekilde yapıldıkları için). Bunlar, dizinin çok uzun bir döngüye sahip olduğundan ve değerlerinin gerçekten tekdüze olduğundan ve gerçekten umursadığımız herhangi bir şekilde sıralı olarak bağımlı olmadığından emin olmak için dikkatli bir şekilde oluşturulmalıdır (genellikle, önemli).xzf

x0

x3

?runifR'ye bakın ve R'de ?.Random.seedbulunan çok sayıda rasgele sayı üretecini açıklayan yardımın bir bağlantısıyla rastgele tohumun varlığını açıkladığını not edeceksiniz (hatta kendiniz bile sağlayabilirsiniz). Aynı yardım sayfası, daha önce rasgele sayı oluşturmayı kullanmadıysanız veya tohumu ayarladıysanız, tohumla başlamak için saatten alındığını ve daha sonra önceki değerin saklandığını (böylece bir sonraki rasgele sayının geçen sefer bir değer daha yaratırsanız elde edeceğiniz değerle aynıdır - "nerede olduğunuzu" hatırlar).

runifR'deki fonksiyon (diğer paketlerde genellikle benzer bir şey yapabilen diğer birkaç rasgele sayı üretme rutini gibi), rasgele sayı tohumunun tutulduğu yeri bilir. Bu değeri güncellemeye devam eder. Dolayısıyla, açıkça bir tohumdan geçirilmek zorunda kalmadan çalışabilir, ancak yine de bir tane kullanır; eğer bir tane vermediysen, sadece son kaydettiğini kullanır.

Neden her seferinde farklı çıktılar verirse (aynı diziyi vermesini söylemezseniz): bunu yapar, çünkü her seferinde aynı değerler genellikle çok karşı üretken olur - tekrarlanan özelliklere sahip olmaz rastgele örnekleme, rastgele sayı üreteçlerini kullandığımız düzenekler için çok yararlı olmaz.


14

Her seferinde aynı sonucu elde etmek için rastgele tohum ayarlamanız gerekir . Bunu yapmak için ? Set.seed kullanın . Düşünmek:

> runif(1)
[1] 0.6467259
> runif(1)
[1] 0.2101857
> set.seed(1)
> runif(1)
[1] 0.2655087
> set.seed(1)
> runif(1)
[1] 0.2655087

Bunu okumak ilginizi çekebilir: set.seed işlevini kullanma nedenleri .


3
Bu, bir takım sonuçların çoğaltılmasının mekaniğini açıklasa da, bu tür bir davranışın neden otomatik olmadığını merak eden sorunun kendisini ele almıyor gibi görünüyor.
whuber

@whuber, sorunun burada konu ile ilgili uzaktan olmadığını düşünüyorum. Anında kapanmaya oy verdim ve bu ayrıcalığa sahip olsaydım bunu tamamen kapatırdım. Bunu OP'nin eli boş kalmaması için yayınladım.
gung - Monica'yı eski

her zaman "set.seed (1)" komutunu çalıştırın.
Nip
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.