假设我有一个客户端服务,每10秒需要一个真正的随机整数值(4个字节)。
因此,我获得了一块硬件,可以根据大气噪声生成真正的随机值。该设备每秒最多可生成8个字节的随机数据。
正如我现在所说的,每10秒钟,我的客户端服务可以查询设备,并从8个生成的字节中提取4个字节。该值立即被客户端服务使用,并被视为真随机。
现在假装我实例化3个新的客户端服务(总共4个),运行相同的算法。这些服务都是同步在一起的,所以他们会同时查询设备。
现在发生的是,在10秒标记处,只有2个服务(4个中)将立即收到随机值,而其他2个服务必须等待1个完整秒才能收到它们的值。这是不可取的。
由于我最大限度地使用了昂贵的设备,我想出了这个解决方案:坐在服务器上的软件(设备连接的地方)实际上将从设备收集所有值,并存储它们在一个队列中(如果RAM变得太大,它将自动出列)。现在,当客户端服务进行查询时,随机值将从该队列中出列,而不是直接从设备中提取。和以前一样,每个随机值只使用一次,但在这种情况下,队列中的某些值可能已经存在了很长时间。
我担心我可能会用这个解决方案做错事。我无法摆脱这种唠叨的感觉,即使用过去产生的价值并且不是新鲜的,我会以某种方式将其转变为伪随机生成器。我的恐惧是正确的还是未经证实的?
答案 0 :(得分:4)
在一天结束时,唯一重要的是你的random
函数产生一系列统计随机值。
为此,您的实现是一次获取一个值还是一次获取所有值并将它们放入队列中并不重要。只要它们足够随意,它们就可以了。
答案 1 :(得分:0)
我必须同意三十二上校。这并不是说客户服务可以选择他们想要使用的特定时间或价值。只要该值尚未使用,它就不应成为问题。
在所有4个设备从设备请求新值后,您可以执行的操作是清除生成的值。既然你说它们都是同时连接和查询的,那应该是每10秒一次。这应该是足够的时间来生成至少4个新的随机数。