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

Project1

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

[已经解决] 从1到100中随机抽10个不重复的数,再用这10个数组成一个数组

[复制链接]

Lv4.逐梦者

梦石
0
星屑
9163
在线时间
466 小时
注册时间
2015-5-8
帖子
866
跳转到指定楼层
1
发表于 2020-8-12 06:57:23 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式

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

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

x
请教大神:
从1到100中随机抽取10个不重复的数,,再用这10个数组成一个数组该怎么写呐。。

多谢了!

Lv4.逐梦者

梦石
0
星屑
13562
在线时间
2753 小时
注册时间
2014-10-4
帖子
756

R考场第七期纪念奖

11
发表于 2020-8-14 17:18:56 | 只看该作者
不全赞同楼上
首先 1.81上 可以用 10.times.inject xxx 这种写法?? 怕是用 1.9x 及以上版本测试的吧
其次 过早优化是万物之源 在不知道这个方法用到何处 使用频率如何之前 有必要纠结优化吗 不如让可读性好一点
再次 确定是"最快"吗
因为一点点小改动就可以让他再快三倍
1. a[i],  a[j] = a[j], a[i]  改成使用临时变量 t 来交换
2. 把数组 [*1..100] 提取到方法的外面 免去重复创建
3. 上一步放到外面后 在方法内不要直接引用 加一个临时变量指向它  提高索引效率
为什么 a[i],  a[j] = a[j], a[i] 的写法更慢 但是ruby却提供这种写法呢?  因为写ruby初衷不就是写的舒服吗
真纠结效率 不如直接写一个 sample的c接口 效率更是能翻50倍

赞成楼上的是 sort 的写法确实有点过简过慢过于偷懒了
假如把"最快"改成“推荐的”“建议的”   那我一点点想法都没有 我完全赞成在最开始就选一个好算法

点评

多谢大神指点!  发表于 2020-9-19 06:18

评分

参与人数 1星屑 +20 收起 理由
RyanBern + 20 我很赞同

查看全部评分

回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

遠航の猫咪

梦石
3
星屑
23186
在线时间
2387 小时
注册时间
2005-10-15
帖子
1166

开拓者

10
发表于 2020-8-14 09:24:43 | 只看该作者
用sort(或sort_by)都会对数组全排序,多出来90次无效的操作
而且在这个case中sort要比sort_by慢6.4倍(sort_by只对每个数取一次rand,sort要在每次两两比较时取rand)
经实验在1.81上最快的方法是:
10.times.inject([*1..100]) {|a, i| j=rand(100-i)+i; a[i],  a[j] = a[j], a[i]; a}[0, 10]

评分

参与人数 1+1 收起 理由
taeckle + 1 多谢了!

查看全部评分

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

使用道具 举报

Lv5.捕梦者 (管理员)

老黄鸡

梦石
0
星屑
42339
在线时间
7598 小时
注册时间
2009-7-6
帖子
13506

开拓者贵宾

9
发表于 2020-8-14 07:17:19 | 只看该作者
RUBY 代码复制
  1. p [*1..100].sort{rand-0.5}[0,10]


仿佛回到原始社会

点评

就这个用例而言sort比sort_by慢6.4倍……  发表于 2020-8-14 09:22

评分

参与人数 1星屑 +50 收起 理由
SailCat + 50 认可答案

查看全部评分

RGDirect - DirectX驱动的RGSS,点我了解.
RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
33434
在线时间
5108 小时
注册时间
2012-11-19
帖子
4878

开拓者

8
发表于 2020-8-14 06:04:58 | 只看该作者
本帖最后由 芯☆淡茹水 于 2020-8-14 06:17 编辑
  1. arr = (1..100).to_a.sort{ rand(3)-1 }[0...10]
  2. p arr
复制代码

点评

多谢大神指点!  发表于 2020-9-19 06:16

评分

参与人数 1星屑 +50 收起 理由
SailCat + 50 认可答案

查看全部评分

xp vx va mv  va mz 各类型脚本/插件定制
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

遠航の猫咪

梦石
3
星屑
23186
在线时间
2387 小时
注册时间
2005-10-15
帖子
1166

开拓者

7
发表于 2020-8-14 03:54:02 | 只看该作者
楼上回答的所有人是全忘了XP的ruby是什么版本吗?如果忘了就请不要在这里给出错误的答案误导楼主。
所有给出错误答案的,警告一次。
SailCat (小猫子·要开心一点) 共上站 24 次,发表过 11 篇文章 上 次 在: [2006年01月28日11:41:18 星期六] 从 [162.105.120.91] 到本站一游。
回复 支持 1 反对 0

使用道具 举报

Lv5.捕梦者

梦石
10
星屑
39587
在线时间
1920 小时
注册时间
2010-11-14
帖子
3320

R考场第七期纪念奖

6
发表于 2020-8-13 21:47:00 | 只看该作者
(1..100).to_a.shuffle.pop(10)

点评

要追求不同写法的话,pop改成shift也是差不多的效果  发表于 2020-8-13 21:48

评分

参与人数 1星屑 -1 收起 理由
SailCat -1 请勿给出误导性质的答案

查看全部评分

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

使用道具 举报

Lv4.逐梦者

「Pemercyia」


Urhurrenna

梦石
0
星屑
9397
在线时间
2748 小时
注册时间
2008-9-5
帖子
3543

开拓者短篇八RM组冠军短篇九导演组亚军白银编剧

5
发表于 2020-8-13 20:03:47 | 只看该作者
本帖最后由 cinderelmini 于 2020-8-15 13:31 编辑

噢~XP的ruby版本不支持.sample啊,改一下改一下~~
(不用.sample好像反而更简单了)

b = []
loop do
  i = rand(100) + 1
  next if b.include?(i)
  b.push(i)
  break if b.size >= 10
end
b.sort!
return b

评分

参与人数 1星屑 -1 收起 理由
SailCat -1 请勿给出误导性质的答案

查看全部评分

回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
7921
在线时间
1049 小时
注册时间
2012-4-3
帖子
1271

开拓者

4
发表于 2020-8-13 18:37:07 手机端发表。 | 只看该作者
def 小学水平
a = []
b = []
for i in 1..100
  a.push(i)
end
10.times do
  c = a[rand(a.size)]
  b.push(c)
  a.delete(c)
end
return b # 返回结果
end
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9163
在线时间
466 小时
注册时间
2015-5-8
帖子
866
3
 楼主| 发表于 2020-8-13 17:49:57 | 只看该作者
请教大家还有其他的写法了吗?

点评

楼上回复的思路1,点评又附加的是思路2,由于用的ruby默认的方法,所以写起来很短。  发表于 2020-8-14 00:42
思路2:将数组随机排列,取需要的样本数即可。  发表于 2020-8-14 00:40
思路1:在数组长度随机取数,获得索引,将该索引值保存到新数组,从旧数组移除该索引,如此循环直到样本数足够。  发表于 2020-8-14 00:39
其实样抽来来去去就几个思路,可是写法因人而异。  发表于 2020-8-14 00:38
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-15 00:50

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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