【问题标题】:c strange use of srand and rand c [closed]c srand 和 rand c 的奇怪用法
【发布时间】:2015-07-23 21:58:34
【问题描述】:

你能帮我理解这些随机化是什么意思吗?

我在我必须翻译的 c 代码中找到它,它总是返回 41:

int main(){
  srand(1);
  printf("\n%d",rand());
}

如何在 Java 中模拟 srand(1) 和 rand()?

【问题讨论】:

  • 我认为这是因为srand()应该是一个“随机”数字,通常使用time()
  • 不,它没有。在我的系统中,它总是产生 1804289383。
  • 您对伪随机数生成有多熟悉?
  • System.out.println("41");
  • 实际上,这对他一点帮助都没有。如果您想要与 C 代码相同的结果,则必须重新实现相同的 RNG。 Java 的 RNG 是不同的,其他 C 编译器也是如此。但是,我强烈怀疑你真正想要完成的事情是不同的......所以退一步,给我们一个更好的观点:你想要完成什么?

标签: java c random srand


【解决方案1】:

我的回答假设你只是想模仿 srand() 和 rand() 的行为,而不关心你说你总是得到的 '41'。

这基本上只是伪随机数生成的想法。如果将种子设置为常数值(在本例中为 1),然后调用 random() 函数,它将始终返回相同的值。这是因为它基本上是在说“在‘随机’数字的大列表中将索引设置为 1”,以便下次我调用 random 时,它会返回该“列表”中的第 n 个值。实际上,它有点复杂,但有时我喜欢这样思考。要在 Java 中模拟代码的行为,您可以尝试以下操作:

public static void main(String[] args) {
    Random rand = new Random(1);

    System.out.println(String.valueOf(rand.nextInt()));
}

【讨论】:

  • 它只返回大的负数...在 c 中返回相同的正数...为什么?
  • 这可以追溯到 Lee Daniel Crocker 对 OP 的评论——生成随机数有不同的方法/算法,Java 和 C 使用不同的方法。
  • 如果您有兴趣,可以在 Wikipedia here 上找到一些(可能是全部,我不确定)PRNG 的列表。
猜你喜欢
  • 2020-12-12
  • 2014-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-23
  • 1970-01-01
相关资源
最近更新 更多