请帮我写“我的”;洗牌;ruby中的代码

请帮我写“我的”;洗牌;ruby中的代码,ruby,shuffle,Ruby,Shuffle,这就是问题所在 洗牌。既然你已经完成了任务 新的排序算法,那么 对面?编写一个shuffle方法 获取一个数组并返回一个 洗牌版。和往常一样,你会 想测试一下,但测试一下这个 更棘手的是:你如何测试以使 你肯定得到了一个完美的答案 洗牌你会怎么说 完美的洗牌是什么?现在测试 它 这是我的密码答案: def shuffle arr x = arr.length while x != 0 new_arr = [] rand_arr = (rand(x)) x-

这就是问题所在

洗牌。既然你已经完成了任务 新的排序算法,那么 对面?编写一个shuffle方法 获取一个数组并返回一个 洗牌版。和往常一样,你会 想测试一下,但测试一下这个 更棘手的是:你如何测试以使 你肯定得到了一个完美的答案 洗牌你会怎么说 完美的洗牌是什么?现在测试 它

这是我的密码答案:

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]))

我的错误是什么?为什么这段代码不起作用?

您的索引与值混淆了。当您执行
new\u-arr.push rand\u-arr
时,您将在
new\u-arr
的末尾添加任何随机索引作为值。你想做的是
new\u arr.push arr[rand\u arr]
,其中
arr[rand\u arr]
arr
中索引
rand\u arr
的值。你的索引与值混淆了。当您执行
new\u-arr.push rand\u-arr
时,您将在
new\u-arr
的末尾添加任何随机索引作为值。您想做的是
new\u arr.push arr[rand\u arr]
,其中
arr[rand\u arr]
arr
中索引
rand\u arr
处的值,除了其他一些小错误之外,您似乎不明白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]))

除了其他一些小错误之外,您似乎不了解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]))

这里有一个更为红润的版本:

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

puts [1,2,3].shuffle!

这里有一个更为红润的版本:

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

puts [1,2,3].shuffle!

以下是一种更简洁的写作方式:

def shuffle(arr)
  new_arr = []

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

  new_arr
end

以下是一种更简洁的写作方式:

def shuffle(arr)
  new_arr = []

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

  new_arr
end

Ruby 1.8.7和1.9.2有一个内置的数组洗牌方法。

Ruby 1.8.7和1.9.2有一个内置的数组洗牌方法。

Mark Thomas答案的变体。由于删除操作的性能,对于大数组,他的算法可能会非常慢

class Array
  def shuffle!
    size.downto(1) do |n|
       index=rand(n)
       # swap elements at index and the end
       self[index], self[size-1] = self[size-1],self[index]
    end
    self
  end
end

puts [1,2,3].shuffle!

此算法为O(大小),而Mark的算法为O(大小^2)。在我的计算机上,马克的答案需要400秒才能在我的机器上洗牌1000000个元素的数组,而我的方法需要0.5秒。

马克·托马斯答案的变体。由于删除操作的性能,对于大数组,他的算法可能会非常慢

class Array
  def shuffle!
    size.downto(1) do |n|
       index=rand(n)
       # swap elements at index and the end
       self[index], self[size-1] = self[size-1],self[index]
    end
    self
  end
end

puts [1,2,3].shuffle!

此算法为O(大小),而Mark的算法为O(大小^2)。在我的电脑上,马克的答案在我的机器上洗牌1000000个元素的数组需要400秒,而我的方法需要0.5秒。

为什么把
rand(x)
放在括号里?什么意思不起作用?回答不好,没有回答,错误信息?作业?面试筛选?rand.rb:7:语法错误,意外的提示符,需要关键字\u end您至少可以发布运行的有效代码…为什么要将
rand(x)
放在括号中?什么意思不起作用?回答不好,没有回答,错误信息?作业?面试筛选?rand.rb:7:语法错误,意外的tIDENTIFIER,需要关键字\u end您至少可以发布运行的有效代码…eror是:rand.rb:7:语法错误,意外的tIDENTIFIER,需要关键字\u end new\u arr.push arr[rand\u arr]代码是:def shuffle arr x=arr.length while x!=0 new_arr=[]rand_arr=(rand(x))x--new_arr.push arr[rand_arr]arr.pop arr[rand_arr]end new_arr end put(shuffle([1,2,3])这是编译错误,只需将x--替换为x=x-1即可修复它。但这还不足以让代码正常工作,还有一些逻辑错误。@gal我建议您在尝试进一步操作之前先学习Ruby。请看减量和增量部分。eror为:rand.rb:7:语法错误,意外的tIDENTIFIER,应为关键字\u end new\u arr.push arr[rand\u arr]代码为:def shuffle arr x=arr.length while x!=0 new_arr=[]rand_arr=(rand(x))x--new_arr.push arr[rand_arr]arr.pop arr[rand_arr]end new_arr end put(shuffle([1,2,3])这是编译错误,只需将x--替换为x=x-1即可修复它。但这还不足以让代码正常工作,还有一些逻辑错误。@gal我建议您在进一步学习之前先学习Ruby。请看减量和增量部分是的,但OP需要将其作为某种赋值来编写。是的,但OP需要将其作为某种赋值来编写。