【问题标题】:How to generate random number using multiple seed values?如何使用多个种子值生成随机数?
【发布时间】:2012-03-01 10:49:46
【问题描述】:

我需要根据多个种子值生成随机数,需要一些关于如何执行此操作的想法。

示例情况:假设您正在编写程序生成的科幻游戏,当玩家飞入某个太阳系时,需要创建行星(大小、类型、资源等)。您有一个游戏 ID,以及该星球的 X、Y、Z 坐标。现在给随机数生成器提供什么?当然,我不能只是将数字相加,因为行星 (1,2,3) 与行星 (3,2,1) 完全相同。程序员要做什么?

【问题讨论】:

  • 有什么理由不把时间当作种子?您想要可重复的结果吗?
  • 为什么每次想要一个新的随机数时都需要一个新的种子?只需在程序开始时播种一次;这就是随机生成器的工作原理。
  • @larsmans,是的,我想要可重复的结果!
  • @MrLister 如果我一开始就播种,结果将无法重现,因为我无法一次生成整个星系。我需要一次生成一个太阳系,我不知道玩家将按什么顺序探索这些系统。
  • "mercenne_twister_engine 类可以通过两种方式播种 - 使用单个无符号 long 值,或者使用包含任意大整数数组的 seed_seq 实例。"也许这就是我要找的! :) 现在要弄清楚如何使用它,文档很少......

标签: random seed


【解决方案1】:

假设每次坐标集都需要相同的种子:只需使用 MD5 或其他哈希算法加密连接字符串。 md5("1,2,3") 与 md5("3,2,1") 不同。或者,如果您需要一个纯数字字符串,请使用类似:“first digit * 9” + “second digit * 8” + “third digit * 7” 这样的字符串。

如果不这样做,请使用上述方法和随机数。

在这种情况下,伪随机就足够了。

【讨论】:

  • 为什么不是“第一位*100+第二位*10+第三位”?
  • 这是个好主意!加入了一点伪随机性,比如?
  • 我尝试了“seed = gameid + x * 4444 + y * 2222”,结果很糟糕,根本不是随机的......然后将 4444 与 1234 交换,将 2222 与 5678 交换,但看起来不太好.. :)
猜你喜欢
  • 2021-05-15
  • 2021-03-23
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 2016-07-22
  • 1970-01-01
  • 2011-02-08
  • 1970-01-01
相关资源
最近更新 更多