在c#中,如何独立保证两台机器不会生成相同的随机数?

时间:2015-06-09 21:28:15

标签: c# random numbers

假设有两台机器正在运行相同的代码,但是你想要偏移正在运行的代码的时间,以便它们不可能同时运行,同时我的意思是不能在5秒内运行彼此。

可以在运行代码开始之前生成一个随机秒数,但这可能会生成相同的数字。

是否有算法可以独立保证不同的随机数?

5 个答案:

答案 0 :(得分:4)

为了保证应用程序不会同时运行,您需要在两者之间进行某种通信。这可能就像某人将配置值设置为在特定时间运行一样简单(如果可以保证它们将同时启动,则延迟设定的秒数)。或者它可能需要调用数据库(或类似的)来确定它何时开始。

答案 1 :(得分:1)

听起来你正在寻找一个调度程序。您需要第三个服务(调度程序),它维护应用程序应该/允许启动的时间。我会避免让应用程序直接相互通话,因为随着您的需求变得更加复杂(第三台计算机被添加,另一项程序必须遵循类似的调度规则等),这将成为一场噩梦。

让程序发送一些独特的东西(机器的MAC地址,只生成一次并存储在配置文件中的GUID等)到调度服务,并让它响应多少秒(如果有的话) )该程序必须等待开始其主执行循环。或者更好的是,在两台计算机上授予调度程序权限,以便在指定的时间运行程序。

你不能在纯粹的隔离中做到这一点 - 让我们说你有一个程序唯一决定等待5秒,而另一个程序等待7秒 - 但是当程序2的计数器在程序开始前2秒启动时会发生什么1?调度程序可以为您处理。

答案 2 :(得分:0)

正如评论/其他答案所指出的那样,当随机并行运行时,真正的随机无法提供任何落入特定范围的保证。

假设您的目标是不同时运行多个进程,您可以强制每台计算机选择不同的时间段来运行该进程。

如果你能在当前时间和"指数"之间达成共识。机器比你可以在选定的插槽上运行你的程序,可能随机偏移带有时隙。

即。使用时间服务来同步时间(连接到几乎任何网络的机器的大多数操作系统的默认行为)和预先为机器分配顺序ID(并有总计数信息)。比让ID机器在时隙中运行(假设计数<60,否则根据计数调整开始时间;在时间同步间隔之间发生小时间漂移时提供足够的时间避免重叠)

(start of an hour + (ID*minutes) + random_offset (0,30 seconds))

这样就不需要机器之间的通信了。

答案 3 :(得分:0)

让两个应用程序读取本地配置文件,等待指定的秒数,然后开始运行。

将0放在一个,6 +放在另一个。它们不会在5秒内相互启动。 (根据需要调整6+以适应机器负载,速度等的变化。)

答案 4 :(得分:0)

不是一个算法,但你可以创建两个完全不同的数字数组,然后在应用程序启动之前从数组中随机获取一个数字。

他们在同一时间运行会受到什么惩罚?

我问的原因是,即使您偏移了开始时间,也可以在另一个完成之前开始。如果他们正在处理的数据增长,那么随着时间的推移,这变得更有可能,并且5s规则变得过时。

如果他们使用相同的资源,那么最好以某种方式使用这些资源来告诉您。例如。在数据库中设置一个标志,或检查是否有足够的可用内存来运行。