Biz yaklaşık sayım algoritması uygulanması am beklendiği gibi çalışmıyorsa:Randomize algoritması
kaydını kullanarak bir sayaç x ettirilir (N log)
başlatma x bitleri 0
Bir ürün geldiğinde, X değerini artırın (& Frac12;) olasılık ile 1 ile x
akışı üzerinde, çıkış 2 x − 1 böylece e [2 x] = N + 1 aşağıdaki gibi
Benim uygulamasıdır:
import System.Random
type Prob = Double
type Tosses = Int
-- * for sake of simplicity we assume 0 <= p <= 1
tos :: Prob -> StdGen -> (Bool,StdGen)
tos p s = (q <= 100*p, s')
where (q,s') = randomR (1,100) s
toses :: Prob -> Tosses -> StdGen -> [(Bool,StdGen)]
toses _ 0 _ = []
toses p n s = let [email protected](b,s') = tos p s in t : toses p (pred n) s'
toses' :: Prob -> Tosses -> StdGen -> [Bool]
toses' p n = fmap fst . toses p n
morris :: StdGen -> [a] -> Int
morris s xs = go s xs 0 where
go _ [] n = n
go s (_:xs) n = go s' xs n' where
(h,s') = tos (0.5^n) s
n' = if h then succ n else n
main :: IO Int
main = do
s <- newStdGen
return $ morris s [1..10000]
sorun benim X daima herhangi |stream| > 2
için yanlış olduğunu, ve
X = 7
Ben Matlab aynı algoritmayı test edilmiş ve o orada çalışıyor, hepsi StdGen
ve |stream| > 1000
için gibi görünüyor, bu yüzden o da varsayıyorum Double
büyük bir n 1/2 yükselterek
benim rasgele sayı üreteci ile bir sorun varken veya
Lütfen ileri bir yol öneriniz?
Matlab'da çalışıyorsa, bu bir algoritma sorunu olamaz. Bunun hangi dil olduğunu bilmiyorum, ancak – ElKamina
stackoverflow'unda yayınlamalısınız, mathy semboller telefonunuzda iyi görünmüyor. ASCII'yi veya en az daha yaygın olarak mevcut sembolleri kullanabilir misiniz? – dfeuer
Gerçekten de 0,5^2000 :: Double' sıfırdır, ancak bunun burada sorun yaratabileceğini göremiyorum. – chi