首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >随机函数(在任何编程语言中)有偏吗?

随机函数(在任何编程语言中)有偏吗?
EN

Stack Overflow用户
提问于 2019-07-27 17:56:04
回答 2查看 514关注 0票数 0

程序设计语言中的函数随机不是偏倚的吗?毕竟,算法需要基于某些东西,这可能会产生偏见。根据这个网站https://mathbits.com/MathBits/CompSci/LibraryFunc/rand.htmrand()函数需要一个开始号,称为seed。它说

函数生成伪随机序列。

我不完全理解背后的逻辑。如果它不是真正的随机(伪随机),有没有办法使它完全随机?

EN

回答 2

Stack Overflow用户

发布于 2019-07-27 18:32:11

根据定义,函数将给定的输入映射到给定的输出。对于伪随机生成器来说,这意味着它将给定的“种子”映射到给定的随机数序列。这样的生成器甚至要开始生成“随机”数字,种子本身就必须具有一些随机性。为此目的有许多种子来源,包括-

  • 高分辨率时间戳,
  • 输入设备的定时,
  • 热噪声,
  • 大气噪音,以及
  • 以上两个或多个源的组合。

而且,一般来说,种子越长,伪随机产生器所能产生的“随机”序列的多样性就越大。

不同的伪随机数发生器(PRNG)具有不同的性质。如果一个特定的PRNG本身是“坏”的,任何种子选择策略都不能使它“更好”。随机数生成器(RNG)的选择将取决于将使用随机数的应用程序类型,并且您并没有真正指定您想到的是哪种应用程序:

  • 如果随机数的目的是以任何方式提高信息安全性(例如,它们作为随机加密密钥、非keys或密码),那么只有密码RNG才能做到这一点。
  • 如果“随机”数字必须在以后的时间重复使用,那么就必须使用高质量的种子PRNG。对于这样一个PRNG,有几个好的和坏的选择。在这个意义上,C中的rand函数使用了一个未指定算法,这妨碍了可重复的“随机性”的目标。
票数 2
EN

Stack Overflow用户

发布于 2019-07-28 17:42:07

历史上,大多数编程语言中的伪随机数函数都很糟糕.在确定性机器上运行的旧算法产生的结果并不理想。

但事情正在改变。所有现代微处理器都有基于硬件的熵生成功能,而像网上银行这样的现代应用已经推动了更好的算法的发展。这完全取决于你心目中的操作系统、语言和库。有非常好的选择,但你必须知道它们是什么,因为坏的选择仍然存在。

类似于C语言的rand()之类的东西可能是最糟糕的。从Linux (或MacOS) /dev/随机获取字节非常好。密码库有很好的算法。这也取决于应用程序--对于密码学来说,你需要非常好的随机数。对于蒙特卡洛积分之类的东西,你需要大量的数字,但不是必要的完全熵--类似于/dev/随机的PRNG就可以了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57234728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档