5 天外有天(4)數字迷宮

(這部分內容完全是選學的。它需要有一定程度的數學知識才可以,如果你對此沒興趣的話可以直接去下一章節,對于Ruby學習沒任何影響。但是可以快速瀏覽一下這一章節中的隨機數部分對以后的學習肯定會派上用場的)

higher-math

關于數字方面使用的方法在數量上與字符串方法幾乎一樣多(同樣的我腦子里也不記得所有的方法)。接下來我們將看到剩下的算術方法、隨機數計算器和數學對象,會用到三角函數和超函數方法。trigonometric and transcendental methods

算術方法

其余的算術方法是 **(乘方/取冪)和%(模數/取余)。如果你想在Ruby中表示5的平方,可以寫成5**2。你也可以在乘方中用浮點數,比如你想對5開根號,可以寫成5**0.5。取余方法可以得到被一個數除以后的余數:比如我用7被3除,會得到2,余數是1。讓我們看看在程序中是如何運行的:

puts 5**2
puts 5**0.5
puts 7/3
puts 7%3
puts 365%7
輸出

從最后一行我們能夠知道一年(非閏年)中有許多個星期外加1天。如果你的生日是今年的星期二,那么下一年生日將會是在周三。在取余中也可以用浮點數。基本上這些方法都會以它們定義的方式運行,稍后我會讓你們熟悉這些方法。

在學習隨機數之前最后需要提到的方法是abs絕對值。它會得到一個數的絕對數值:

puts((5-2).abs)
puts((2-5).abs)

隨機數

Ruby天生就自帶有一個相當不錯的隨機數生成器。得到一個隨機數字的方法是rand。如果你直接調用rand,你會得到一個大于等于0.0至小于1.0之間的浮點數;如果你給rand一個整數(以5為例),你將會得到一個大于等于0至小于5的整數(也就是5個可能的數字,從0到4)。

下面讓我們在例子中學習rand

puts rand
puts rand
puts rand
puts(rand(100))
puts(rand(100))
puts(rand(100))
puts(rand(1))
puts(rand(1))
puts(rand(1))
puts(rand(99999999999999999999999999999999999999999999999999999999999))
puts('The weatherman said there is a '+rand(101).to_s+'% chance of rain,')
puts('but you can never trust a weatherman.')

rand

注意到我用rand(101)得到從0到100之間的整數,rand(1)總會返回0.我發現rand使用通常是由于不清楚返回值的范圍而導致的錯誤,即使是專業的程序員,甚至從商店中買到的軟件最終版本也會出現問題。我曾經有一個CD播放機,如果設置為“隨機播放”,它能播放除了最后一首歌外的所有歌曲……(我好奇的是如果我插入一個只有一首歌的CD,那么會發生什么?)

有時你可能想在程序運行多次的情況下能在同一個位置返回相同的隨機數(比如我有一次在一個電腦游戲中用隨機數創建一個隨機生成的副本,我會喜歡上某個副本,就像再玩一次這個副本或這把這個副本發給一個朋友)這種情況下你需要設置一個隨機數種子,這里可以用srand,像下面這樣:

srand 1776
puts(rand(100))
puts(rand(100))
puts(rand(100))
puts(rand(100))
puts(rand(100))
puts ''
srand 1776
puts(rand(100))
puts(rand(100))
puts(rand(100))
puts(rand(100))
puts(rand(100))


輸出

每次你用相同的隨機種子運行程序,它都將得到相同的結果。如果你想再次得到不同的數字(回到沒使用srand前的那樣),只需調用 srand 0.這樣做會用一個特別的數字作為隨機種子,這個數字是用你電腦當前的時間,這個時間會精確到毫秒。每個種子都會不一樣,從而隨機得到不一樣的結果 ----譯者注

數學中的對象

最后讓我們來了解一下數學中的對象。我們可以直接用下面的例子:

puts(Math::PI)
puts(Math::E)
puts(Math.cos(Math::PI/3))
puts(Math.tan(Math::PI/4))
puts(Math.log(Math::E**2))
puts((1 + Math.sqrt(5))/2)


輸出

牽涉到 cos 60,tan 90,log e^2,平方根 ----譯者注
你首先會注意到的可能是::符號。這個官方稱呼是叫范圍解析操作符,解釋它是個啥意思,嗯…有點超過指導資料的范圍了。我發誓我絕無雙關之意,總之你可以用Math::PI來指代你想代替的。
范圍解析操作符:用于訪問靜態成員、方法和常量,還可以用于覆蓋類中的成員和方法 ---譯者注

從上面可以知道:數學里面包含著你期望一個科學計算器擁有的所有東西。鑒于此,浮點數將會是解決問題的正確答案。

所以接下來我們來學習流程控制Flow Control

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容