【问题标题】:Generating seed values for pseudorandom number generators为伪随机数生成器生成种子值
【发布时间】:2013-12-29 05:34:08
【问题描述】:

我有 4 个整数,我想将其转换为种子以生成随机数。我知道这在很大程度上是任意的,但是我确实想确保我目前正在做的事情不是矫枉过正(或者没有产生足够的种子值传播)。

我有大约 1000 个对象,我想根据它们的一些变量来获得随机属性。

两个变量是常数,介于 0 - 1000 范围内,并且对于每个对象都是随机的,可能会出现重复,但这根本不可能(constant1constant2)。其他两个变量通过程序运行在很长一段时间内以 1 的增量变化,从 0 开始,可以是有符号 int32 范围内的任何位置,但往往在 -100 和 100 之间(variable1variable2 )。

如何根据这 4 个值适当地生成种子?

【问题讨论】:

  • (constant1*variable1)XOR(constant2*variable2)怎么样
  • 由于variable1variable2 以0 开头,所有对象最初将具有相同的种子!
  • 然后执行variable1+1variable2+1variableX 是否可以预测?它们究竟是如何变化的?所有对象都一样吗?我的意思是,他们会确定性地改变价值观吗?如果是这样,为什么将它们用作(部分)种子?
  • 同样,variable1variable2 的值都可以是 -1。是的,变化是确定性的。这些变量表示对象位置必须回绕到屏幕的次数。即如果object1 位于x = 1100 并且屏幕有width = 500 然后variable1 = 2 因为它已被回绕到屏幕两次。 y 轴和variable2 相同。所有物体都沿相同的方向矢量移动,只是速度不同。我想尽可能多地删除细节,但也许这是有必要知道的。
  • 但它们可能 在某些时候的值为-1 ...根据您所说的应该是随机的。无论如何,如果更改是确定性的,那么我认为将它们作为种子的一部分是没有意义的(如果我理解正确的话,我不确定:) 在这一点上我只想说“异或所有四个"

标签: random seed


【解决方案1】:
    1234563得到一颗种子。
  1. 因为 1. 并且假设 constant1constant2 默认在 0-1000 之间是随机的,你可以使用 constant1 * 1000 + constant2 来获取 0 到 1000000 之间的随机数。我不确定随机分布,但应该足以获得种子。

更新

如果确实需要获取种子依赖于其他两个变量,可以按照模式进行,如下:

var seed = ((variable1 * 200 + variable) * 1000 + constant1) * 1000 + constant2;

但由于它超出了Int32 范围,您必须在unsafe 上下文中执行此操作,以防止OverflowException 被抛出。

最后一件事:我不能 100% 确定它会给你生成值的标准化分布。

【讨论】:

  • 要求变化的变量参与到种子中。我只在变量发生变化时重新生成种子,因此这些随机值不会在程序的每一步都重新播种。
  • 但是为什么需要改变种子呢?它不会给你更多随机的结果。
  • 变化的变量与对象的位置有关,而我描述的随机属性需要与这些位置相关。每次变量发生变化时,我都不能只使用Random.Next(),因为我需要这些属性在从 A 点到 B 点再回到 A 点时保持一致。
  • 如果只有Random.Back() 存在:P
猜你喜欢
  • 1970-01-01
  • 2011-02-08
  • 2012-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-23
  • 2014-05-18
相关资源
最近更新 更多