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

Project1

 找回密码
 注册会员
搜索
查看: 2648|回复: 11

[已经解决] 请问如何随机抽取数组中的3个数据

[复制链接]

Lv3.寻梦者

梦石
0
星屑
2920
在线时间
713 小时
注册时间
2010-7-25
帖子
813

开拓者

发表于 2019-1-10 16:18:36 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 jianyulei 于 2019-1-10 20:00 编辑

一个包含有各种相同数据、不同数据、空值的数组中,如何随机抽取3个不同位置编号的数据?如果抽到了空值则舍去空值(但仍算作一次抽取),被抽取的数组要去除对应的元素。
就像是从卡包里抽取卡片一样

Lv5.捕梦者

梦石
10
星屑
39440
在线时间
1914 小时
注册时间
2010-11-14
帖子
3315

R考场第七期纪念奖

发表于 2019-1-10 16:40:33 | 显示全部楼层
本帖最后由 KB.Driver 于 2019-1-10 16:45 编辑

自己写脚本的话要善用F1文档
QQ截图20190110163909.png
QQ截图20190110164023.png
数组为a的话,
RUBY 代码复制
  1. a = a - [nil]
就行


另一方法
QQ截图20190110164547.png
QQ截图20190110164559.png
RUBY 代码复制
  1. a.delete(nil)

点评

记住找标准库和游戏库就好。标准库一般就是看内建类的Array和Hash,游戏库比较多时候是看Bimap和Sprite。  发表于 2019-1-10 16:50
F1文档不能正常搜索,如果对脚本不是特别熟的话使用起来很困难。  发表于 2019-1-10 16:47

评分

参与人数 1+1 收起 理由
jianyulei + 1 我很赞同

查看全部评分

用头画头像,用脚写脚本
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
10
星屑
39440
在线时间
1914 小时
注册时间
2010-11-14
帖子
3315

R考场第七期纪念奖

发表于 2019-1-10 16:56:39 | 显示全部楼层
本帖最后由 KB.Driver 于 2019-1-10 17:04 编辑

你这编辑还把标题和问题描述都改了= =
这样显得我答非所问啊

抽取其实也简单。

RUBY 代码复制
  1. class Array
  2. def 抽取(number) #number是抽取的数量
  3.   raise "数组长度小于要抽取的数量!" if self.size < number
  4.   result = []
  5.   while result.size < number
  6.     index = rand(self.size)
  7.     result << index unless result.include?(index) #防止抽到重复的
  8.   end
  9.   result.collect{|index| self[index]}
  10. end
  11. end
  12. #使用方法: array.抽取(3)

评分

参与人数 1+1 收起 理由
jianyulei + 1 塞糖

查看全部评分

用头画头像,用脚写脚本
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2920
在线时间
713 小时
注册时间
2010-7-25
帖子
813

开拓者

 楼主| 发表于 2019-1-10 19:44:37 | 显示全部楼层
本帖最后由 jianyulei 于 2019-1-10 19:51 编辑
KB.Driver 发表于 2019-1-10 16:56
你这编辑还把标题和问题描述都改了= =
这样显得我答非所问啊


我尝试了下,你和我的方法似乎都不太行,不能真正做到“抽取”的效果,抽取之后原本的数组中被抽取的元素应该消失才对。
例如有2个数组 A和B,B= [1,6,nil,7,3,1,nil]
随机抽3个,抽到了b[5]的1,b[2]的nil,b[3]的7,
这三个元素就放到A数组里变成a[nil ,7 ,1] 而a数组还剩下[1,6,3,nil]

点评

对哦,抽3次就行了,没必要非得一次抽3张。  发表于 2019-1-10 20:03
a1 = b.delete_at(rand(b.size)) ; a2 = b.delete_at(rand(b.size)) ; a3 = b.delete_at(rand(b.size)); a = [a1,a2,a3]  发表于 2019-1-10 20:00
@灯笼菜刀王 rand用了抽的数量不就不确定了吗?  发表于 2019-1-10 19:58
val = array.delete_at(rand(varray.size))  发表于 2019-1-10 19:50
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
10
星屑
39440
在线时间
1914 小时
注册时间
2010-11-14
帖子
3315

R考场第七期纪念奖

发表于 2019-1-10 21:51:30 | 显示全部楼层
本帖最后由 KB.Driver 于 2019-1-10 21:55 编辑
jianyulei 发表于 2019-1-10 19:44
我尝试了下,你和我的方法似乎都不太行,不能真正做到“抽取”的效果,抽取之后原本的数组中被抽取的元素 ...


原来你要的是抽完就没掉……
结合菜刀王的话可以写成函数:
RUBY 代码复制
  1. class Array
  2.   def 抽取(number)
  3.     raise "抽取数量大于数组长度!" if number > self.size
  4.     result = []
  5.     number.times{ result << self.delete_at(rand(self.size)) }
  6.     return result
  7.   end
  8. end


QQ截图20190110215604.png

评分

参与人数 2星屑 +20 +1 收起 理由
VIPArcher + 20 辛苦了
jianyulei + 1 认可答案

查看全部评分

用头画头像,用脚写脚本
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
19269
在线时间
3073 小时
注册时间
2013-1-11
帖子
1288
发表于 2019-1-10 22:12:13 | 显示全部楼层
本帖最后由 张咚咚 于 2019-1-10 22:15 编辑
  1. data = ('A'..'Z').to_a
  2. data -= r = data.shuffle[0,3]
  3. p r, data
复制代码

评分

参与人数 2星屑 +20 +1 收起 理由
VIPArcher + 20 认可答案
jianyulei + 1 塞糖

查看全部评分

回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-3-29 18:42

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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