说我有一些号码n==4
。假设我从m
范围内以均匀和随机的方式绘制了一些[0, 10]
。设p
为(n+m)
定义为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]
的长(例如,1024个条目)列表:
m
如果猜测者知道绘制guess.append(p[i] - 5)
的范围,那么他们只能减去该范围的平均值,因为平均值是均匀随机分布的中心。在我们的示例中,这对应于以下行:
n
我们可以通过计算guess[]
中数字的平均值来验证此方法是否能够对隐藏数print("average of entries in guess[] is: ")
print(guess_sum/1024)
产生一个很好的估算值:
3.9365234375, 3.9619140625, 4.177734375, 3.763671875, 4.0439453125
例如,我得到的结果如下:1024
。根据预期,随着样本数量增加超过4
,我们预计我们的结果范围会在n
附近收紧。
我的问题 - 如果猜测者不知道m
被绘制的范围,那么猜猜者如何能够恢复隐藏号码m
?假设n
是从每个实验的相同范围中提取的,loop
永远不会改变。
我知道有人必须回答这个问题,但我对如何前进感到非常难过。谢谢!
答案 0 :(得分:0)
我发布此问题后,我发现了一种方法,但只有在我们提前了解m_min
或m_max
的值时才会生效。对于此解决方案,我们需要m_min = 0.
假设我原始问题中定义的所有变量名称。
guesser只知道列表p
中的一串值。当猜测者在列表p
中附加更多数字时,他们可以记录两个项目:recorded_min
和recorded_max
,分别对应于看到的最小数字和看到的最大数字。 / p>
让我们将m
绘制范围的端点命名为[m_min, m_max]
。回想一下,猜测者希望从列表n
中的条目中恢复隐藏号码p
的值。
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