设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2317|回复: 8
打印 上一主题 下一主题

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

[复制链接]

Lv4.逐梦者

梦石
0
星屑
9128
在线时间
463 小时
注册时间
2015-5-8
帖子
865
跳转到指定楼层
1
发表于 2021-12-31 19:01:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 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



现在想请教下最简单的写法(比如用一行代码就能搞定这个问题的写法),还请大家指点一二,多谢了

Lv4.逐梦者

梦石
0
星屑
10620
在线时间
2012 小时
注册时间
2013-6-10
帖子
1498
2
发表于 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 大神威武!

查看全部评分

回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
4914
在线时间
445 小时
注册时间
2011-3-26
帖子
101
3
发表于 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 多谢了!

查看全部评分

回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

遠航の猫咪

梦石
3
星屑
22437
在线时间
2335 小时
注册时间
2005-10-15
帖子
1160

开拓者

4
发表于 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] 到本站一游。
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9128
在线时间
463 小时
注册时间
2015-5-8
帖子
865
5
 楼主| 发表于 2022-2-5 06:58:22 | 只看该作者
SailCat 发表于 2022-1-1 00:08
SEP 插件的核心插件有这个功能,Array#shuffle和Array#shuffle!

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

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-4-25 21:54

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表