ste*_*lag 10
sample 采取论点:
[*(1..10)].sample(5) #=>[3, 4, 1, 8, 9]
Run Code Online (Sandbox Code Playgroud)
不会选择任何元素两次.
对阵列进行混洗不是内存密集型的.Ruby有一个默认的shuffle实现,它被称为Array.shuffle!.查看源代码,您可以看到(它是C):
rb_ary_shuffle_bang(ary)
VALUE ary;
{
long i = RARRAY(ary)->len;
rb_ary_modify(ary);
while (i) {
long j = rb_genrand_real()*i;
VALUE tmp = RARRAY(ary)->ptr[--i];
RARRAY(ary)->ptr[i] = RARRAY(ary)->ptr[j];
RARRAY(ary)->ptr[j] = tmp;
}
return ary;
}
Run Code Online (Sandbox Code Playgroud)
该实现遵循经典的Fisher-Yates算法.
所以:
shuffle!.时间复杂度O(n),不需要额外的内存.O(n),不需要额外的内存(只有一个整数来保存当前索引).总的来说,您拥有所需的内容,无需额外的内存和时间复杂性O(n).
| 归档时间: |
|
| 查看次数: |
1154 次 |
| 最近记录: |