2016-11-12 56 views
0

说我有一些号码n==4。假设我从[0, 10]范围内统一绘制了一些m。让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从不改变。

我知道有人必须回答这个问题,但我很难于如何前进。谢谢!

+0

你应该考虑在问这个上math.se甚至更好stats.se – ShreevatsaR

+1

顺便说一句,答案是,你不能,一般来说:如果你采取统一分布在[0,10]上,并将它翻译为4,就可以得到[4,14]上的均匀分布,这与[3,13]上的均匀分布并将其翻译为1是不可区分的。所以除非你有一些比U([3,13])更喜欢U([0,10])的方法,否则这个问题没有唯一的答案。 – ShreevatsaR

回答

0

我发布了这个问题后,我发生了一种方法,但它只适用于我们事先知道m_minm_max的值。对于这个解决方案,让我们需要m_min = 0.

假设我的原始问题中定义的所有变量名称。

guesser只知道列表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 
相关问题