当前位置: 首页 > 知识库问答 >
问题:

为什么兰特()的使用被认为是不好的?

梅跃
2023-03-14

我听到一些人说,即使在使用srand()获得种子之后,使用rand()也是很糟糕的。为什么会这样?我想知道事情是怎么发生的...抱歉,我又问了一个问题..但是,有什么办法可以替代这一点呢?

共有1个答案

宋晋
2023-03-14

这个故事有两个部分。

首先,rand是伪随机数生成器。这意味着它取决于一个种子。对于给定的种子,它总是给出相同的序列(假设实现相同)。这使得它不适合于安全问题很大的某些应用程序。但这并不特定于rand。这是任何伪随机发生器的问题。在许多问题的类中,伪随机发生器是可以接受的。真随机生成器有其自身的问题(效率、实现、熵),所以对于与安全性无关的问题,最常用的是伪随机生成器。

所以你分析了你的问题,你得出一个伪随机发生器是解决方案。在这里,我们谈到了C random库(包括RANDSRAND)的真正问题,这些问题是由哪些特定于它而使它过时的(也就是:您永远不应该使用RAND和C random库的原因)。

>

  • 一个问题是它具有全局状态(由srand设置)。这使得无法同时使用多个随机引擎。它还使多线程任务大大复杂化。

    它最明显的问题是缺少一个分发引擎:rand给出了一个间隔[0 RAND_MAX]中的数字。在这个区间内是均匀的,这意味着这个区间内的每个数字出现的概率是相同的。但大多数情况下,您需要一个特定间隔中的随机数。假设[0,1017]。一个常用的公式是rand()%1018。但这样做的问题是,除非rand_max1018的精确倍数,否则不会得到统一的分布。

    另一个问题是rand的实现质量。这里有其他的答案比我更详细,所以请阅读它们。

    在现代C++中,您肯定应该使用 中的C++库,该库带有多个随机的、定义良好的引擎,以及用于整数和浮点类型的各种发行版。

  •  类似资料:
    • 问题内容: 我问了一个一般性的Spring问题:自动播发Spring Bean,并让多个人回答说应尽可能避免调用Spring 。这是为什么? 我还应该如何访问配置了Spring创建的Bean? 我在非Web应用程序中使用Spring,并计划按照LiorH的描述访问共享对象。 修正案 我接受下面的答案,但这是Martin Fowler的另一种选择,他讨论了依赖注入与使用(本质上与调用相同)的优点。

    • 我有一个问题,关于什么是正确的做法,使用SwingU实用程序的调用稍后方法。 所以首先,我想确认我理解正确。 据我所知,对GUI的更改必须在EDT上完成,因为Swing组件不是线程安全的。invokeLater方法将Runnable作为参数,该Runnable中包含的任何内容都将在EDT上运行。因此,对Swing组件的任何调用都被放入一种队列中,在EDT上一次执行一个。 有了这些,我的问题是:使用

    • 问题内容: 为什么每个人都告诉我编写这样的代码是一种不好的做法? 我省略花括号的最大论据是,有时花括号可能是花括号的两倍。例如,以下代码为C#中的标签绘制发光效果。 您还可以获得链接usings在一起的额外好处,而不必缩进一百万次。 花括号的最常见参数涉及维护编程,以及在原始if语句及其预期结果之间插入代码会引起的问题: 问题: 想要使用该语言提供的更紧凑的语法是错误的吗?设计这些语言的人很聪明,

    • 问题内容: 编辑:在上面的链接中回答的问题。 不,PHP中的“全局”与其他语言中的“全局”不同,尽管它不引入任何安全性问题,但会使其他人较难理解该代码。 OP: 项目摘要-我正在编写一个Web CMS,以使自己熟悉PHP / MySQL。为了分解代码,我对以下基本层/模块有一个概念: 数据 -MySQL表 -PHP变量 功能 -SQL- 获取/设置/等 -前端-显示页面 -后端-管理器 演示文稿

    • 我正在按照这篇文章撤销用户访问权限: http://bitoftech . net/2014/07/16/enable-oauth-refresh-tokens-angular js-app-using-ASP-net-we b-API-2-owin/ 现在考虑一下,在验证用户之后,我已经发布了一个访问令牌,使用期限为30分钟,如上面的文章所示,刷新令牌为1天,但是如果管理员在10分钟内删除该用户

    • 问题内容: 我有一个类的以下代码,它工作正常: 但是,我认为在该方法中实现OnClickListener是一种不好的做法。为什么会有这种不好的做法,还有什么更好的选择? 问题答案: 最好在ViewHolder中处理单击逻辑的原因是,它允许更明确的单击侦听器。如Commonsware书中所述: 很久以来,ListView行中的可单击小部件(如RatingBar)一直与行本身的单击事件发生冲突。获取可