查看: 3325|回复: 8

[已经解决] 请教把一个数组重新随机排序的最简单写法

[复制链接]
梦石
0
星屑
9160
在线时间
466 小时
注册时间
2015-5-8
回帖
704
发表于 2021-12-31 19:01:50 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 taeckle 于 2021-12-31 19:19 编辑

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

我目前用了一个笨方法:
[pre lang="ruby"]arr = ["元素1","元素2","元素3","元素4"] #目标数组,想把这个数组内的元素重新随机排序

arr_1 = [] #自己建立的辅助数组

for i in 0...arr.size
  arr_1 = arr.delete_at(rand(arr.length))
end  

arr=arr_1

p arr

[/pre]


现在想请教下最简单的写法(比如用一行代码就能搞定这个问题的写法),还请大家指点一二,多谢了
梦石
0
星屑
14444
在线时间
2633 小时
注册时间
2013-6-10
回帖
1707
发表于 2021-12-31 21:34:02 | 显示全部楼层
arr.sort(function(a, b){return 0.5 - Math.random()});

点评

arr.sort!{0.5 - rand}  发表于 2021-12-31 23:45
因为我以为这是mv区。。  发表于 2021-12-31 23:15
...这是js  发表于 2021-12-31 23:13
你这个不是ruby吧  发表于 2021-12-31 22:37

评分

参与人数 1赞 +1 收起 理由
taeckle + 1 大神威武!

查看全部评分

回复

使用道具 举报

梦石
0
星屑
5204
在线时间
457 小时
注册时间
2011-3-26
回帖
100
发表于 2021-12-31 21:52:40 | 显示全部楼层
本帖最后由 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就是节省了一点存储空间

评分

参与人数 2星屑 +50 赞 +1 收起 理由
RyanBern + 50 认可答案
taeckle + 1 多谢了!

查看全部评分

回复

使用道具 举报

遠航の猫咪

梦石
3
星屑
26984
在线时间
2426 小时
注册时间
2005-10-15
回帖
989

开拓者

发表于 2022-1-1 00:08:59 | 显示全部楼层
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
复制代码

评分

参与人数 2星屑 +50 赞 +1 收起 理由
RyanBern + 50 认可答案
taeckle + 1 大神威武!

查看全部评分

SailCat (小猫子·要开心一点) 共上站 24 次,发表过 11 篇文章 上 次 在: [2006年01月28日11:41:18 星期六] 从 [162.105.120.91] 到本站一游。
回复

使用道具 举报

梦石
0
星屑
9160
在线时间
466 小时
注册时间
2015-5-8
回帖
704
 楼主| 发表于 2022-2-5 06:58:22 | 显示全部楼层
SailCat 发表于 2022-1-1 00:08
SEP 插件的核心插件有这个功能,Array#shuffle和Array#shuffle!

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

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部