如何在ruby中生成随机数(generate random numbers in ruby)

没有一台计算机能纯粹通过计算产生真正的随机数。他们所能做的最好的事情就是生成伪随机数,伪随机数是一系列看似随机但并非如此的数字。...

01

2004年

这些数字实际上并不是随机的

没有一台计算机能纯粹通过计算产生真正的随机数。他们所能做的最好的事情就是生成伪随机数,伪随机数是一系列看似随机但并非如此的数字。

对于人类观察者来说,这些数字确实是随机的。不会有短的重复序列,而且,至少对人类观察者来说,它们不会呈现出清晰的模式。但是,如果有足够的时间和动机,可以发现原始种子,重新创建序列,并猜测序列中的下一个数字。

因此,本文中讨论的方法可能不应用于生成必须是加密安全的数字。

伪随机数生成器必须被播种,以便在每次生成新的随机数时生成不同的序列。没有什么方法是神奇的——这些看似随机的数字是使用相对简单的算法和相对简单的算法生成的。通过播种PRNG,您每次都在不同的点启动它。如果你没有给它播种,它每次都会产生相同的数字序列。

在Ruby中,可以无参数调用内核#srand方法。它将根据时间、进程ID和序列号选择一个随机数种子。只需在程序开始时调用srand,它就会在每次运行时生成一系列看似随机的数字。该方法在程序启动时隐式调用,并使用时间和进程ID(无序列号)为PRNG种子。

Numbers

02

2004年

生成数

一旦程序运行并且内核#srand被隐式或显式调用,就可以调用内核#rand方法。此方法在没有参数的情况下调用,将返回一个从0到1的随机数。在过去,这个数字通常被缩放到您希望生成的最大数字,也许是为了把它转换成整数。

#生成0到10之间的整数

但是,如果使用Ruby1.9.x,Ruby会使事情变得更简单。Kernel#rand方法可以接受单个参数。如果此参数是任何类型的数字,Ruby将生成一个从0到(不包括)该数字的整数。

#生成一个从0到10的数字

但是,如果要生成一个从10到15的数字,该怎么办?通常,您会生成一个从0到5的数字,然后将其添加到10。然而,Ruby使它变得更容易。

您可以将一个Range对象传递给Kernel#rand,它将按照您所期望的那样执行:在该范围内生成一个随机整数。

请务必注意这两种类型的范围。如果调用rand(10..15),将生成一个从10到15(包括15)的数字。而rand(10…15)(带3个点)将生成一个从10到15的数字,不包括15。

#生成一个从10到15的数字

03

2004年

非随机数

有时您需要一个随机的数字序列,但每次都需要生成相同的序列。例如,如果在单元测试中生成随机数,则每次都应生成相同的数字序列。

在一个序列上失败的单元测试应该在下一次运行时再次失败,如果它在下一次生成一个差异序列,它可能不会失败。为此,请使用已知的常量值调用Kernel#srand。

#每次生成相同的数字序列

04

2004年

有一个警告

Kernel#rand的实现相当不Ruby。它不会以任何方式抽象PRNG,也不允许您实例化PRNG。PRNG有一个所有代码共享的全局状态。如果您更改种子或以其他方式更改PRNG的状态,其影响范围可能比您预期的更广。

然而,由于程序期望这种方法的结果是随机的——这就是它的目的这可能永远不会成为问题。只有当程序希望看到一个预期的数字序列时(例如,如果它使用常量值调用了srand),才会看到意外的结果。

  • 发表于 2021-10-01 07:40
  • 阅读 ( 215 )
  • 分类:编程

你可能感兴趣的文章

红宝石(ruby)和python(python)的区别

关键区别——ruby与python Ruby和Python是高级编程语言,因为它们遵循与英语语言相似的语法。因此,程序员很容易理解这些语言。Ruby和Python都是解释语言。两种语言都有大量的社区支持。Ruby和Python的一个主要优点是这些语言支...

  • 发布于 2020-10-19 17:41
  • 阅读 ( 338 )

如何使用click在python中创建自己的命令行程序

... 下面是如何使用它来活跃Python项目。 ...

  • 发布于 2021-03-23 13:56
  • 阅读 ( 267 )

使用静态站点生成器快速构建网站

...看一下上面的屏幕截图——在第五行,您会注意到输出“Generating…” ...

  • 发布于 2021-03-25 19:23
  • 阅读 ( 306 )

如何使用powershell生成随机姓名和电话号码

...从数组中选择一个随机项并将其吐出。它也可以用来生成随机数。关于随机数和随机数,要记住的一点是,和许多其他计算机操作一样,它从零开始计数。因此,与其得到Random 10,意思是更自然的“给我一个从1到10的数字”,它...

  • 发布于 2021-04-11 08:59
  • 阅读 ( 267 )

如何生成完全随机/杂乱文本的段落

你可能已经知道Lorem Ipsum或者Random Text Generator之类的工具,但是最终可能发生的是——尽管文本的性质不同——人们仍然关注文本并试图阅读它。当这种情况发生时,使用完全随机或乱七八糟的文本可以派上用场。 当lorem ipsum...

  • 发布于 2021-04-12 01:57
  • 阅读 ( 158 )

你所说的:你如何记录你的密码

...banking, credit cards, &c.) I use 20+ character gobbledygook passwords generated by KeePass. On many forum-type sites I use the same old user name and password, since the worst that could happen is that someone could post something in my non-recognizable name. Doc使用KeePass,并对只使用...

  • 发布于 2021-04-12 23:24
  • 阅读 ( 224 )

ruby for kids教你的孩子(和你自己)ruby编程语言

...gosu库中的游戏开发。这是一种有趣的方法来教你的孩子如何编程,如果你还不是Ruby专家,它甚至可以帮助你学习语言。Ruby For childs与Hakety-Hack(另一个很棒的Ruby学习资源)有几个不同之处。首先,他们采取以游戏为中心的学习...

  • 发布于 2021-07-25 04:52
  • 阅读 ( 173 )

使用logger库-如何在ruby中编写日志消息

在Ruby中使用logger库是跟踪代码何时出错的一种简单方法。当出现错误时,详细说明导致错误的原因可以节省查找错误的时间。随着程序变得越来越大、越来越复杂,您可能需要添加一种写入日志消息的方法。Ruby附带了许多有用...

  • 发布于 2021-09-12 07:28
  • 阅读 ( 192 )

如何在ruby中组合数组(combine arrays in ruby)

“组合数组的最佳方式是什么?”这个问题相当模糊,可能意味着一些不同的事情。 串联 连接是将一个事物附加到另一个事物上。例如,将数组[1,2,3]和[4,5,6]连接起来将得到[1,2,3,4,5,6]。这可以在Ruby中通过几种方式实现。 ...

  • 发布于 2021-09-12 07:29
  • 阅读 ( 210 )

ruby编程语言初学者指南

...等替代实现可以作为解决这些问题的解决方案。 ruby是如何使用的? Ruby用于典型的脚本语言应用程序,如文本处理和“胶水”或中间件程序。它适用于小型的、特别的脚本任务,在过去,这些任务可能是用Perl解决的。用Ruby...

  • 发布于 2021-09-12 07:30
  • 阅读 ( 196 )
kevxw5882
kevxw5882

0 篇文章

相关推荐