1

これが質問です

シャッフル。新しいソート アルゴリズムが完成したので、逆のアルゴリズムはどうでしょうか。配列を取り、完全にシャッフルされたバージョンを返すシャッフル メソッドを記述します。いつものように、あなたはそれをテストしたいと思うでしょうが、これをテストするのはよりトリッキーです: 完璧なシャッフルが得られていることを確認するにはどうすればテストできますか? 完璧なシャッフルとは何だと思いますか? 今それをテストします。

これは私のコードの答えです:

def shuffle arr
    x = arr.length
while x != 0
        new_arr = []
    rand_arr = (rand(x))
    x--
    new_arr.push rand_arr
    arr.pop rand_arr
end

new_arr

end

puts (shuffle ([1,2,3]))

私の間違いは何ですか?このコードが機能しないのはなぜですか?

4

6 に答える 6

2

これは、はるかに Rubyish なバージョンです。

class Array
  def shuffle!
    size.downto(1) { |n| push delete_at(rand(n)) }
    self
  end
end

puts [1,2,3].shuffle!
于 2010-11-12T13:08:19.310 に答える
2

より簡潔な書き方は次のとおりです。

def shuffle(arr)
  new_arr = []

  while (arr.any?) do 
    new_arr << arr.delete_at(rand(arr.length))
  end

  new_arr
end

そしていくつかのテスト:

5.times do
  puts shuffle((1..5).to_a).join(',')
end

>> 4,2,1,3,5
>> 3,2,1,4,5
>> 4,2,5,1,3
>> 5,2,1,4,3
>> 4,3,1,5,2
于 2010-11-12T16:04:36.730 に答える
1

他のマイナーなエラーに加えて、pop と push が何をしているのか理解していないようです (配列の末尾からいくつかの項目を取得または追加します)。

あなたはおそらく以下のようなものを書こうとしているでしょう。

def shuffle arr
    x = arr.length
    new_arr = []
    while x != 0
        randpos = rand(x)
        x = x-1
        item = arr[randpos]
        new_arr.push item
        arr[randpos] = arr[x]
        arr.pop
    end

    new_arr

end

puts (shuffle ([1,2,3]))
于 2010-11-12T10:30:50.497 に答える
1

インデックスが値と混同されています。を実行するnew_arr.push rand_arrと、思いついた任意のランダム インデックスを の末尾に値として配置しますnew_arr。あなたがするつもりだったのはnew_arr.push arr[rand_arr]arr[rand_arr]は のインデックスの値rand_arrですarr

于 2010-11-12T10:19:27.217 に答える
0

Ruby 1.8.7 と 1.9.2 には Array#shuffle メソッドが組み込まれています。

于 2010-11-12T19:58:37.813 に答える