如何从该数与范围内的随机样本之和中恢复出一个数?

2024-04-27 03:02:43 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一些数字n==4。假设我有一些m[0, 10]范围内均匀随机地画出来。让p是定义为(n+m)的长(比如1024个条目)总和列表:

from __future__ import division
import random


myRand = random.SystemRandom()
n = 4
p = []
guess = []
guess_sum = 0 

for i in range(1024):
    m = myRand.randint(0, 10)
    p.append(n + m)
    guess.append(p[i] - 5)
    guess_sum += guess[i]

如果猜测者知道绘制m的范围,那么他们可以减去这个范围的平均值,因为平均值是均匀随机分布的中心。在我们的示例中,这对应于行:

guess.append(p[i] - 5)

我们可以通过取guess[]中的数字的平均值来验证此方法产生了对隐藏数n的良好估计:

print("average of entries in guess[] is: ")
print(guess_sum/1024)

例如,我得到如下结果:3.9365234375, 3.9619140625, 4.177734375, 3.763671875, 4.0439453125。根据预期,随着样本数量增加超过1024,我们预计我们的结果范围将在4左右收紧。你知道吗

我的问题-如果一个猜测者不知道m的范围,她怎么能恢复隐藏的数字n?假设每个实验的m都是从相同的范围内得出的,并且n永远不会改变。你知道吗

我知道肯定有人回答了这个问题,但我对如何前进感到困惑。谢谢您!你知道吗


Tags: inimport列表定义条目数字random平均值
1条回答
网友
1楼 · 发布于 2024-04-27 03:02:43

在我发布这个问题之后,我想到了一个方法,但是它只有在我们事先知道m_minm_max的值时才起作用。对于这个解决方案,我们需要m_min = 0.

假设所有变量名都是我最初问题中定义的。你知道吗

猜测者只知道列表p中的一串值。当猜测者在列表p中添加更多的数字时,他们可以记录两个项目:recorded_minrecorded_max,分别对应于看到的最小数字和看到的最大数字。你知道吗

让我们将绘制m的范围的端点命名为[m_min, m_max]。回想一下,猜测者希望从列表p中的条目中恢复隐藏数字n的值。你知道吗

recorded_min~=n+m_min
recorded_max~=n+m_max

其中~=表示近似相等。你知道吗

在列表p中有足够长的一系列条目之后,我们对recorded_min的值和recorded_max的值进行了一些有一定可信度的猜测。你知道吗

注意,recorded_max - recorded_min给出了m_max - m_min,它给出了绘制m的范围的长度。你知道吗

因为我们知道m是在这个范围内均匀随机绘制的,所以它的中心是center = m_min + (recorded_max - recorded_min)/2,或者等价地center = m_max - (recorded_max - recorded_min/2)。因为我们需要m_min = 0,所以我们得到了随机分布的中心。你知道吗

我们现在可以从列表p中提取样本,然后从每个样本中减去center,然后像以前一样取平均值,得出n的猜测值。你知道吗

# python 2.7.10

from __future__ import division
import random

myRand = random.SystemRandom()
n = 4
p = []
guess = []
guess_sum = 0
num_experiments = 1024 * 80

m_min = 0
m_max = 0

while (m_max <= m_min):
    m_max = myRand.randint(0, 10)

recorded_min = float('inf')
recorded_max = 0
center = 0

for i in range(num_experiments):
    m = myRand.randint(m_min, m_max)
    p.append(n + m)
    if p[i] < recorded_min:
        recorded_min = p[i]
    if p[i] > recorded_max:
        recorded_max = p[i]

center = (recorded_max - recorded_min)/2

for i in range(num_experiments):
    guess.append(p[i]-center)
    guess_sum += guess[i]

print("average of entries in guess[] is: ")
print(guess_sum/num_experiments)
print("true value of n is: ")
print(n)
print("true m_min, m_max are: ")
print(m_min, m_max)
print("guessed m_min, m_max are: ")
print(recorded_min - guess_sum/num_experiments, recorded_max - guess_sum/num_experiments)
print("true center is: ")
print((m_min + m_max) / 2)
print("guessed center is: ")
print(center)

退货:

average of entries in guess[] is: 
4.00238037109
true value of n is: 
4
true m_min, m_max are: 
(0, 2)
guessed m_min, m_max are: 
(-0.00238037109375, 1.99761962890625)
true center is: 
1.0
guessed center is: 
1.0

相关问题 更多 >