龙空技术网

拉斯维加斯与蒙特卡洛算法

好奇研究者的研究 149

前言:

现在小伙伴们对“拉斯维加斯算法的基本思想”都比较看重,看官们都需要分析一些“拉斯维加斯算法的基本思想”的相关知识。那么小编在网上搜集了一些对于“拉斯维加斯算法的基本思想””的相关内容,希望大家能喜欢,我们一起来学习一下吧!

拉斯维加斯算法是一种随机算法,他总是会给出正确的结果,可以用来预测彩票。

蒙特卡罗模拟是一大类算法使用重复随机抽样来获得数值结果,通常用于模拟其他系统的行为。

另一方面,蒙特卡罗算法,是输出可能不正确的随机算法具有一定的的概率,通常很小。

使用拉斯维加斯算法计算圆圈中的随机点既简单又方便。

这个想法是首先生成一个点(x,y),其中-1<x<1和-1<y<1。如果这个点恰好落在单位圆内,我们保留它,否则,我们会把它扔掉,然后再试一次。

这个算法显然给出了正确的结果,但它赌的是调用随机数生成器的次数。

// Point returns a random point in the unit circle.

func Point() (x, y float64) {

for { // This loop runs 4/π times on average.

x = 2*rand.Float64() - 1

y = 2*rand.Float64() - 1

if x*x+y*y < 1 {

return

}

}

}

但是,请注意,若是使用以下函数给出了不均匀的分布。它更有可能在圆的中间产生一个点。

func Point() (x, y float64) {

r := rand.Float64()

θ := 2 * math.Pi * rand.Float64()

return r * math.Cos(θ), r * math.Sin(θ)

}

如果点(x,y),其中-1<x<1和-1<y<1,随机放置,落在单位圆内的点的比例将接近π/4。

蒙特卡罗模拟将在正方形中随机放置点并使用圆圈内点的百分比来估计π的价值。

const n = 100000

count := 0

for i := 0; i < n; i++ {

x := 2*rand.Float64() - 1

y := 2*rand.Float64() - 1

if x*x+y*y < 1 {

count++

}

}

fmt.Println(4 * float64(count) / float64(n)) // 3.1484

可以以此为种子,作为伪随机数序列的起点。如果你从同一个种子开始,你会得到完全相同的序列。

如果您每次都想要不同的数字序列,您可以将当前时间用作种子。

这就是形成我们特有的彩票规则下生成的彩票随机数字。

标签: #拉斯维加斯算法的基本思想