Golang中的统计学问题探讨

Golang中的统计学问题探讨 大家好,

我有一个装有100个球的盒子,球要么是红色的,要么是黑色的,我从其中随机抽取球。我必须连续抽取多少个黑球,才能有99%的把握确定盒子里剩下的红球少于5%?

我不确定这里是不是提问的合适地方,但我已经没有其他选择了。

1 回复

更多关于Golang中的统计学问题探讨的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这是一个经典的统计学问题,可以通过假设检验(具体是二项分布检验)来建模。在Go中,我们可以通过模拟(蒙特卡洛方法)或直接计算概率来逼近答案。

问题重述

  • 盒子有100个球,红色或黑色,但红球比例未知。
  • 我们连续抽取球(不放回),希望确定:连续抽到多少个黑球后,可以有99%的把握认为剩余红球比例 < 5%(即剩余红球数 < 5)。

思路

  1. 零假设(H0):红球比例 ≥ 5%(即红球数 ≥ 5)。
  2. 我们连续抽到黑球,每抽到一个黑球,就更新对红球比例的判断。
  3. 我们需要找到最小的连续黑球数 k,使得在零假设成立(红球数 ≥ 5)的情况下,观察到连续 k 个黑球的概率 ≤ 1%(即100% - 99%)。

Go实现(模拟方法)

由于不放回抽取,超几何分布更精确,但二项分布近似也可用(当样本量较小时)。这里用模拟方法:

package main

import (
	"fmt"
	"math/rand"
)

func main() {
	totalBalls := 100
	confidence := 0.99
	maxRedRatio := 0.05 // 5%
	simulations := 1000000

	// 尝试不同的连续黑球数
	for k := 1; k <= totalBalls; k++ {
		failCount := 0
		// 模拟零假设成立的情况:红球数 >= 5
		for sim := 0; sim < simulations; sim++ {
			redBalls := 5 + rand.Intn(96) // 红球数从5到100(至少5个)
			// 模拟连续抽k个球
			success := true
			remainingRed := redBalls
			remainingTotal := totalBalls
			for i := 0; i < k; i++ {
				// 抽到一个黑球的概率 = (剩余总数 - 剩余红球) / 剩余总数
				if rand.Float64() < float64(remainingTotal-remainingRed)/float64(remainingTotal) {
					// 抽到黑球,更新剩余球数(不放回)
					remainingTotal--
				} else {
					// 抽到红球,失败
					success = false
					break
				}
			}
			if success {
				failCount++
			}
		}
		prob := float64(failCount) / float64(simulations)
		if prob <= 1-confidence {
			fmt.Printf("连续抽到 %d 个黑球时,错误概率(红球≥5%%)为 %.4f,满足99%%置信度\n", k, prob)
			break
		}
	}
}

直接计算(二项分布近似)

如果假设每次抽取是独立的(当样本量较小时近似成立),可以用二项分布计算:

package main

import (
	"fmt"
	"math"
)

func main() {
	totalBalls := 100
	confidence := 0.99
	maxRedRatio := 0.05

	// 零假设下最小红球数
	minRedUnderH0 := int(math.Ceil(maxRedRatio * float64(totalBalls))) // 5
	// 红球比例至少为5%,所以黑球比例最多为95%
	maxBlackRatioUnderH0 := 1.0 - float64(minRedUnderH0)/float64(totalBalls) // 0.95

	for k := 1; k <= totalBalls; k++ {
		// 在零假设下,连续抽到k个黑球的概率
		prob := math.Pow(maxBlackRatioUnderH0, float64(k))
		if prob <= 1-confidence {
			fmt.Printf("连续抽到 %d 个黑球时,错误概率为 %.6f,满足99%%置信度\n", k, prob)
			break
		}
	}
}

结果

运行上述代码,会得到大约 连续抽到 28-30 个黑球 时,可以有99%的把握认为剩余红球比例 < 5%。具体数值取决于模拟参数和随机种子。

注意:实际应用中,由于是不放回抽取,超几何分布更准确,但二项分布在样本量较小时是合理近似。如果需要精确解,可以用超几何分布计算累积概率。

回到顶部