簡體   English   中英

Ruby方法以二進制形式返回哈希值

[英]Ruby method returns hash values in binary

我編寫了一個方法,該方法使用六個名稱,然后使用四個6邊骰子生成七個隨機數的數組。 丟棄四個6面骰子中的最低值,然后將其余的值相加以創建該值。 然后將該值添加到數組。

一旦生成了七個數字,則將數組從最高到最低排序,並刪除最低值。 然后將名稱數組和值數組壓縮在一起以創建哈希。

此方法確保名稱數組中的名字接收最高值,而名字接收最低值。

這是調用該方法的結果:

{:strength=>1, :dexterity=>1, :constitution=>0, :intelligence=>0, :wisdom=>0, :charisma=>1}

如您所見,我收到的所有值都是“ 1”或“ 0”。 我不知道這是怎么回事。

這是代碼:

module PriorityStatGenerator

  def self.roll_stats(first_stat, second_stat, third_stat, fourth_stat, fifth_stat, sixth_stat)
    stats_priority = [first_stat, second_stat, third_stat, fourth_stat, fifth_stat, sixth_stat].map(&:to_sym)
    roll_array = self.roll

    return Hash[stats_priority.zip(roll_array)]
  end

  private

  def self.roll

    roll_array = []

    7.times {
      roll_array << Array.new(4).map{ 1 + rand(6) }.sort.drop(1).sum
    }
    roll_array.reverse.delete_at(6)
  end
end

這是我在測試時調用方法的方式:

render plain: PriorityStatGenerator.roll_stats(params[:prioritize][:first_stat], params[:prioritize][:second_stat], params[:prioritize][:third_stat], params[:prioritize][:fourth_stat], params[:prioritize][:fifth_stat], params[:prioritize][:sixth_stat])

我在調用該方法require 'priority_stat_generator'地方添加了require 'priority_stat_generator' ,因此它可以正確地調用它。

有人可以幫助我讓它返回介於1到18之間的正確值嗎?

您需要學習使用IRB或PRY來測試代碼片段,或者更好的是,學習使用調試器。 它們使您洞悉代碼的作用。

在IRB中:

[7,6,5,4,3,2,1].delete_at(6)
1

換句話說, delete_at(6)正在執行應有的操作,但這不是您想要的。 相反,切片數組的行為可能更像您期望的那樣:

>> [7,6,5,4,3,2,1][0..-2]
[
    [0] 7,
    [1] 6,
    [2] 5,
    [3] 4,
    [4] 3,
    [5] 2
]

另外,在您的代碼中,當該操作是方法中的最后邏輯步驟時,不必return值。 Ruby將返回最后看到的值:

Hash[stats_priority.zip(roll_array)]

這是一種簡化操作,並使用實際上是隨機數生成器的重構,因為rand 非常糟糕

require 'securerandom'

module PriorityStatGenerator
  def self.roll_stats(*stats)
    Hash[
      stats.map(&:to_sym).zip(self.roll(stats.length).reverse)
    ]
  end

private
  def self.roll(n = 7)
    (n + 1).times.map do
      4.times.map { 1 + SecureRandom.random_number(6) }.sort.drop(1).inject(:+)
    end.sort.last(n)
  end
end

這利用了inject(:+)因此可以在純Ruby中工作,不需要ActiveSupport。

*stats的使用使roll_stats函數的方式更加靈活。 您的版本具有非常嚴格的參數數量,這令人困惑並且經常令人討厭。 將參數視為數組可避免由於有六個參數而產生的許多約束。

需要說明的是,不清楚為什么要先創建N + 1個角色,然后放棄最后一個。 這與生成N且不丟棄任何N相同。 也許您打算對它們進行排序並獲得N最佳?

更新:添加了sortreverse以正確地映射優先級。

正如amadan所說,我看不到您是如何獲得結果的,但是它們是代碼中肯定的錯誤。

self.roll的最后一行是返回值。

roll_array.reverse.delete_at(6)

這將返回已刪除的值。 您需要添加新行以返回roll_array而不是delete_at值。 您也不會在刪除最后一個項目之前對數組進行排序,這也會給您錯誤的值。

def self.roll
  roll_array = []
  7.times {
    roll_array << Array.new(4).map{ 1 + rand(6) }.sort.drop(1).sum
  }
  roll_array.sort.drop(1) 
  roll_array
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM