【问题标题】:seed random numbers in cc中的种子随机数
【发布时间】:2014-10-03 18:42:45
【问题描述】:

我目前正在尝试自学 C 编程。我一直在学习随机数。我访问的许多网站都使用 time() 函数作为播种随机数生成器的方法。但是我读过的许多帖子和网站都说使用系统时钟作为产生随机数的方法是有缺陷的。我的问题是“我究竟应该使用什么来生成真正的随机数?我应该只用算术操作数字还是有别的东西?具体来说,我正在寻找程序员遵循以生成随机数的“最佳实践” c 编程语言中的数字。

这是我正在谈论的网站的示例:

http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?answer=1042005782&id=1043284385

【问题讨论】:

  • 如果您必须使用rand(),请仔细检查此链接以了解其危害。 channel9.msdn.com/Events/GoingNative/2013/…
  • 如果你只是学习 c,srand(time(NULL)) 就足够了。除非你需要经常调用你的程序
  • 我是 C 的初学者,但我以前编程过。当我学习一门语言时,我更愿意慢慢学习并学习最佳实践。
  • @CroCo 30 分钟视频?
  • @FiddlingBits:该视频描述了rand() 的几乎所有错误,尽管它没有提到为每个随机数调用srand() 的令人惊讶的频繁错误,但它提供的解决方案虽然完全正确,是 C++ 特定的,所以它对 C 项目没有太大帮助。因此,如果您使用 C 语言编写,请观看前半部分,然后获取 Mersenne twister 参考实现,并在任何具有该功能的系统或 Windows 等效系统上从 /dev/random 播种一次。

标签: c random random-seed


【解决方案1】:

如果你想要一个随机数,请使用:

randomize () ; 

m = random(your limit); 
printf("%d", m);// dont forget to include stdlib

【讨论】:

  • randomize() 不只是将当前时间分配给种子吗? (OP 试图避免的)
【解决方案2】:

srand(time(NULL)) 足以满足一般基本用途。它的缺点是:

  • 它不适合密码学,因为攻击者有可能预测伪随机序列。密码学中使用的随机数必须是不可预测的。
  • 如果您快速连续多次运行该程序,RNG 将使用相同或相似的值播种(因为当前时间没有太大变化),因此您很可能每次都得到相似的伪随机序列时间。
  • 如果您使用rand 生成很多随机数,您可能会发现它们在统计上分布不均。如果您正在执行 Monte Carlo 模拟之类的操作,这可能很重要。

有更复杂的 RNG 库可用于加密和统计用途。

【讨论】:

    猜你喜欢
    • 2017-01-25
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多