Project1

标题: 从1到100中随机抽10个不重复的数,再用这10个数组成一个数组 [打印本页]

作者: taeckle    时间: 2020-8-12 06:57
标题: 从1到100中随机抽10个不重复的数,再用这10个数组成一个数组
请教大神:
从1到100中随机抽取10个不重复的数,,再用这10个数组成一个数组该怎么写呐。。

多谢了!
作者: 浮云半仙    时间: 2020-8-12 07:39
(1..100).to_a.sample(10)


作者: taeckle    时间: 2020-8-13 17:49
请教大家还有其他的写法了吗?
作者: Im剑侠客    时间: 2020-8-13 18:37
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
作者: cinderelmini    时间: 2020-8-13 20:03
本帖最后由 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
作者: KB.Driver    时间: 2020-8-13 21:47
(1..100).to_a.shuffle.pop(10)
作者: SailCat    时间: 2020-8-14 03:54
楼上回答的所有人是全忘了XP的ruby是什么版本吗?如果忘了就请不要在这里给出错误的答案误导楼主。
所有给出错误答案的,警告一次。
作者: 芯☆淡茹水    时间: 2020-8-14 06:04
本帖最后由 芯☆淡茹水 于 2020-8-14 06:17 编辑
  1. arr = (1..100).to_a.sort{ rand(3)-1 }[0...10]
  2. p arr
复制代码

作者: fux2    时间: 2020-8-14 07:17
RUBY 代码复制
  1. p [*1..100].sort{rand-0.5}[0,10]


仿佛回到原始社会
作者: SailCat    时间: 2020-8-14 09:24
用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]
作者: SixRC    时间: 2020-8-14 17:18
不全赞同楼上
首先 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 的写法确实有点过简过慢过于偷懒了
假如把"最快"改成“推荐的”“建议的”   那我一点点想法都没有 我完全赞成在最开始就选一个好算法




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