一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Ruby - Ruby生成隨機數的方法總結

Ruby生成隨機數的方法總結

2020-05-13 10:32腳本之家 Ruby

在本文里小編給大家分享的是關于Ruby生成隨機數的知識點方法,有需要的朋友們可以學習下。

數字實際上不是隨機的

沒有一臺計算機能純粹通過計算產生真正的隨機數。它們能做的最好的事情就是生成偽隨機數,偽隨機數是一組看起來隨機但實際上不是隨機的數字。

對于人類觀察者來說,這些數字確實是隨機的。不會有短的重復序列,而且,至少對人類觀察者來說,它們是完全隨機的。但是,如果有足夠的時間和動機,就可以發現原始種子,重新創建序列,并猜測序列中的下一個數字。

因此,本文中討論的方法可能不應該用于生成必須加密安全的數字。

如上所述,必須對偽隨機數生成器(PRNGs)進行播種,以便每次生成新的隨機數時產生不同的序列。請記住,沒有一種方法是神奇的——這些看似隨機的數字是用相對簡單的算法和相對簡單的算術生成的。通過播種PRNG,每次都可以從不同的點開始。如果你不播種,它每次都會產生相同的數字序列。

在Ruby中,可以不帶參數地調用內核#srand方法。它將根據時間、進程ID和序列號選擇隨機數種子。只需在程序開始時在任何地方調用srand,每次運行它時都會生成一系列不同的看似隨機的數字。當程序啟動時隱式地調用此方法,并使用時間和進程ID(無序列號)播種PRNG。

生成數字

一旦程序運行并且內核#srand被隱式或顯式地調用,就可以調用內核#rand方法。這個方法調用時沒有參數,它將返回一個從0到1的隨機數。在過去,這個數字通常被縮放到您希望生成的最大數字,也許to_i調用它來將其轉換為整數。

?
1
2
# Generate an integer from 0 to 10
puts (rand() * 10).to_i

然而,如果您使用Ruby 1.9.x, Ruby會使事情變得更簡單。Kernel#rand方法可以接受單個參數。如果這個參數是任何類型的數字,Ruby將生成一個從0到(不包括)那個數字的整數。

?
1
2
3
# Generate a number from 0 to 10
# In a more readable way
puts rand(10)

但是,如果您想要生成一個從10到15的數字呢?通常,您會生成一個從0到5的數字,并將其添加到10。然而,Ruby使它更容易。

您可以將一個Range對象傳遞給Kernel#rand,它的作用正如您所期望的:在該范圍內生成一個隨機整數。

一定要注意這兩種類型的范圍。如果調用rand(10..15),就會生成一個從10到15的數字,包括15。而蘭德(10…15)(有3個點)將產生一個從10到15的數字,不包括15。

?
1
2
3
# Generate a number from 10 to 15
# Including 15
puts rand(10..15)

非隨機隨機數

有時您需要一個看起來隨機的數字序列,但每次都需要生成相同的序列。例如,如果在單元測試中生成隨機數,那么每次都應該生成相同的數字序列。

在一個序列上失敗的單元測試在下一次運行時應該會再次失敗,如果下一次它生成了一個不同的序列,那么它可能不會失敗。為此,使用一個已知的常量值調用內核#srand。

?
1
2
3
4
5
# Generate the same sequence of numbers every time
# the program is run
srand(5)
# Generate 10 random numbers
puts (0..10).map{rand(0..10)}

注意,內核#rand的實現是非ruby的。它不以任何方式抽象PRNG,也不允許實例化PRNG。對于PRNG,所有代碼共享一個全局狀態。如果您更改種子或以其他方式更改PRNG的狀態,其影響范圍可能比您預期的更廣。

然而,由于程序期望這個方法的結果是隨機的(因為這是它的目的),這可能永遠不會成為問題。只有當程序期望看到一個預期的數字序列時,例如它調用了一個具有常量值的srand,它才會看到意外的結果。

延伸 · 閱讀

精彩推薦
  • RubyRuby簡潔學習筆記(一):字符串、數字、類和對象

    Ruby簡潔學習筆記(一):字符串、數字、類和對象

    這篇文章主要介紹了Ruby簡潔學習筆記(一):字符串、數字、類和對象,本文是學習筆記第一篇,需要的朋友可以參考下 ...

    腳本之家2472020-04-20
  • RubyRuby進行文件信息輸出實例代碼

    Ruby進行文件信息輸出實例代碼

    Ruby進行文件信息輸出實例代碼,數據是隨機的,所以每次的記錄都會不同。 ...

    ruby教程網2962020-04-10
  • Ruby簡要說明Ruby中的迭代器

    簡要說明Ruby中的迭代器

    這篇文章主要介紹了Ruby中的迭代器,迭代器的概念在動態語言的編程中十分重要,文章中介紹了Ruby中的each迭代器和collect迭代器,需要的朋友可以參考下 ...

    goldensun2772020-04-25
  • Ruby剖析 Ruby 訪問控制

    剖析 Ruby 訪問控制

    前面,我們說 Ruby 沒有函數,只有方法.而且實際上有不止一種方法.這一節我們介紹 訪問控制 (accesscontrols). 想想當我們在最高層而不是在一個類的定義里定義...

    ruby教程網3572020-04-08
  • RubyRuby設計模式編程中使用Builder建造者模式的實例

    Ruby設計模式編程中使用Builder建造者模式的實例

    這篇文章主要介紹了Ruby設計模式編程中使用Builder建造者模式的實例,建造者模式將一個復雜對象的構造與它的表示分離,使同樣的構建過程可以創建不同的表...

    范孝鵬2192020-05-07
  • RubyRuby迭代器的7種技巧分享

    Ruby迭代器的7種技巧分享

    這篇文章主要介紹了Ruby迭代器的7種技巧分享,Ruby中的迭代器非常人性化,本文既是講解了7個技巧也是講解了7種迭代器,需要的朋友可以參考下 ...

    腳本之家4782020-04-20
  • RubyRuby環境下安裝使用bundler來管理多版本的gem

    Ruby環境下安裝使用bundler來管理多版本的gem

    這篇文章主要介紹了Ruby環境下安裝使用bundler來管理多版本的gem的方法,舉了Ruby On Rails中的應用實例來進行演示,需要的朋友可以參考下 ...

    日拱一卒4332020-05-10
  • RubyCentOS中配置Ruby on Rails環境

    CentOS中配置Ruby on Rails環境

    經過一個上午的折騰,終于把ROR環境在CentOS中搞定,繞了很多彎路,把文章寫下來總結一下 ...

    可樂加糖4762020-04-12
主站蜘蛛池模板: 日本福利视频一区 | 2019年国产不卡在线刷新 | 高h全肉动漫在线观看免费 高h辣h双处全是肉军婚 | 污到湿的爽文免费阅读 | 久久99热狠狠色AV蜜臀 | 亚洲精品一区二区久久这里 | 青青青手机视频在线观看 | 欧美z0z0人禽交 | 日韩国产成人精品视频人 | 亚洲欧美国产精品久久久 | 国产女主播在线播放一区二区 | 欧美精品国产一区二区三区 | 特级av毛片免费观看 | 成人久久伊人精品伊人 | 久久伊人影院 | 高清黄色直接看 | 久久青青草原 | 美女操批| 欧美18-19sex性处 | 欧美成a人片免费看久久 | 玩高中女同桌肉色短丝袜脚文 | 视频国产91| 久久亚洲精品AV成人无码 | 久久se视频精品视频在线 | 欧美猛男同志同性video | 亚洲国产区中文在线观看 | 特黄特色大片免费视频大全 | 亚洲精品第二页 | 19+韩国女主播激情vip视频在线 | 欧美粗黑巨大gay | 5g影院天天爽爽 | 九九99香蕉在线视频美国毛片 | 国产91免费 | 调教女高中生第3部分 | v视影院 | 久久综合香蕉久久久久久久 | 亚洲天堂精品视频 | 国产3344视频在线观看免费 | 吉川爱美与黑人解禁 | 国产精品毛片久久久久久久 | 国产亚洲精品自在线亚洲情侣 |