我正在经历Google Interview Questions
。从implement
到1 to 7
生成随机数。
我写了一个简单的代码,我想了解如果在interview
这个问题向我询问,如果我写下面的代码是否可以接受?
import time
def generate_rand():
ret = str(time.time()) # time in second like, 12345.1234
ret = int(ret[-1])
if ret == 0 or ret == 1:
return 1
elif ret > 7:
ret = ret - 7
return ret
return ret
while 1:
print(generate_rand())
time.sleep(1) # Just to see the output in the STDOUT
答案 0 :(得分:2)
(由于问题似乎要求分析代码中的问题而不是解决方案,我不提供。)
答案是不可接受的,因为:
您需要等待每个随机数一秒钟。许多应用程序一次需要几百个。 (如果睡眠只是为了方便,请注意即使是微秒的粒度也不会产生真正的随机数,因为最后一微秒将单调增加,直到达到10us。你可能会在10us的范围内完成多次调用将是一组单调增加的伪随机数)。
随机数具有均匀分布。理论上每个元素应具有相同的概率。在这种情况下,与1
范围内的其他0, 1
相比,7
的概率增加7, 8, 9
和2-6
概率增加1-7
1}}。
通常,对此类问题的回答将尝试获取大量数字,并从1-5
均匀分配范围。例如,如果你想要10
的随机性,上面的方法可以正常工作,因为5
可以被/dev/random
整除。注意,这只能解决上面的(2)。
对于(1),还有其他随机源,例如Linux OS上的a
。
答案 1 :(得分:1)
你还没有真正指出你试图解决的问题的限制,但如果它来自一系列面试问题,它似乎可能像{{3 }}
在任何情况下,由于以下原因,所显示的答案是不可接受的:
即使您从time.time()
读取的样本是统一的,结果的分布也不一致。
time.time()
的结果可能不一致。结果取决于您拨打电话的时间,如果您的电话未及时均匀分配,则结果可能也不会均匀分布。在最坏的情况下,如果您尝试在非常快的处理器上随机化数组,那么您可能会在时间更改之前完成整个操作,因此整个数组将填充相同的值。或者至少是大块的。
对随机值的更改是高度可预测的,可以从程序运行的速度推断出来。在速度非常快的计算机机箱中,你会得到一堆x
,然后是一堆x+1
,但即使计算机速度慢或时钟更精确,你也可以# 39;可能会获得以类似可预测的方式运行的混叠模式。
由于您将时间值设为十进制,因此最低有效数字可能无法统一访问所有可能的值。它很可能是从二进制转换为任意数量的十进制数字,并且当发生这种情况时,最低有效数字的分布可能非常不均匀。
代码应该更简单。这是一个复杂的解决方案,有许多特殊情况,它反映了对问题的零碎方法,而不是对相关原则的理解。理想的解决方案会使行为不言而喻,而不必单独考虑每个案例。
最后一个可能会结束采访,我很害怕。也许不是,如果你能讲一个关于你如何到达那里的好故事。
您需要了解this才能开始制定解决方案。对于可能的值0到9,您似乎将时间减少到最低有效十进制数字。法律结果是1到7.如果您有七个鸽舍和十只鸽子,那么您可以先将您的前七羽鸽子放入每个一个洞,但是你剩下三只鸽子。如果你只使用整只鸽子,那么你可以放下剩下的三只鸽子,这样每个洞都有相同数量的鸽子。
问题在于,如果你随机挑选一只鸽子并询问它是什么洞,答案更可能是一个有两只鸽子的洞而不是一洞。这就是所谓的"非统一",它会导致各种各样的问题,具体取决于您需要的随机数。
你要么想弄清楚如何确保所有的洞都被平等地填充,要么你必须想出解释它为什么不重要的原因。
通常"并不重要"答案是每个洞里面都有一百万或一百万只鸽子和一只鸽子,而且对于问题的严重程度,你将无法检测出偏见。
答案 2 :(得分:0)
使用您创建的相同的通用架构,我会做这样的事情:
import time
def generate_rand():
ret = str(time.time()) # time in second like, 12345.1234
ret = ret % 8 # will return pseudorandom numbers 0-7
if ret == 0:
return 1 # or you could also return the result of another call to generate_rand()
return ret
while 1:
print(generate_rand())
time.sleep(1)