Project1

标题: 请教把一个数组重新随机排序的最简单写法 [打印本页]

作者: taeckle    时间: 2021-12-31 19:01
标题: 请教把一个数组重新随机排序的最简单写法
本帖最后由 taeckle 于 2021-12-31 19:19 编辑

具体情况是这样的,首先我得到一个含有4个元素(或N个元素)的数组,然后我想将这个数组的元素重新随机排序

我目前用了一个笨方法:
RUBY 代码复制
  1. arr = ["元素1","元素2","元素3","元素4"] #目标数组,想把这个数组内的元素重新随机排序
  2.  
  3. arr_1 = [] #自己建立的辅助数组
  4.  
  5. for i in 0...arr.size
  6.   arr_1[i] = arr.delete_at(rand(arr.length))
  7. end  
  8.  
  9. arr=arr_1
  10.  
  11. p arr



现在想请教下最简单的写法(比如用一行代码就能搞定这个问题的写法),还请大家指点一二,多谢了
作者: 小怪兽奇奇侠    时间: 2021-12-31 21:34
arr.sort(function(a, b){return 0.5 - Math.random()});
作者: rfvtgbzxc    时间: 2021-12-31 21:52
本帖最后由 rfvtgbzxc 于 2021-12-31 21:56 编辑

一行写出来难免用到tricks,最简朴的的应该就是洗牌算法了吧。
  1. def shuffle!(arr)
  2.   for i in 0...arr.size
  3.     j = rand(arr.size - i) + i
  4.     arr[i],arr[j] = arr[j],arr[i]
  5.   end
  6. end

  7. arr1 = [1,2,3,4,5]
  8. shuffle!(arr1)
  9. puts arr1
复制代码

这个算法的随机性需要证明,但是我不会2333
https://www.jianshu.com/p/7a5946cfce87
想偷懒可以把其作为Array类的内置函数(不要在大项目里面随便改这些类,容易冲突,RM这种小工程随意,留个记号就行):
  1. class Array
  2.   def shuffle!
  3.     for i in 0...self.size
  4.       j = rand(self.size - i) + i
  5.       self[i],self[j] = self[j],self[i]
  6.     end
  7.   end
  8. end
  9. arr1 = [1,2,3,4,5]
  10. arr1.shuffle!
  11. puts arr1
复制代码

仔细想想貌似跟你的算法也没有太大区别2333就是节省了一点存储空间
作者: SailCat    时间: 2022-1-1 00:08
SEP 插件的核心插件有这个功能,Array#shuffle和Array#shuffle!
  1. #==============================================================================
  2. # ■ Array
  3. #------------------------------------------------------------------------------
  4. #   数组的增强功能。
  5. #==============================================================================
  6. class Array
  7.   #--------------------------------------------------------------------------
  8.   # ● 洗牌
  9.   #--------------------------------------------------------------------------
  10.   def shuffle
  11.     self.clone.shuffle!
  12.   end
  13.   #--------------------------------------------------------------------------
  14.   # ● 破坏性洗牌
  15.   #--------------------------------------------------------------------------
  16.   def shuffle!
  17.     (size - 1).times do |i|
  18.       j = i + rand(size - i)
  19.       t = self[j]; self[j] = self[i]; self[i] = t
  20.     end
  21.   end
  22.   #--------------------------------------------------------------------------
  23.   # ● 取样
  24.   #--------------------------------------------------------------------------
  25.   def sample(num = 1)
  26.     return [] if num <= 0
  27.     return self[rand(size)] if num == 1
  28.     ary = clone
  29.     return ary if num >= size
  30.     num.times do |i|
  31.       j = i + rand(size - i)
  32.       t = ary[j]; ary[j] = ary[i]; ary[i] = t
  33.     end
  34.     ary[0...num]
  35.   end
  36. end
复制代码

作者: taeckle    时间: 2022-2-5 06:58
SailCat 发表于 2022-1-1 00:08
SEP 插件的核心插件有这个功能,Array#shuffle和Array#shuffle!

大神请问下你的这个SEP插件的核心插件怎么安装到我的工程里啊?




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1