Random 朱莉娅:从不断缩小的范围内取样的最佳方法?

Random 朱莉娅:从不断缩小的范围内取样的最佳方法?,random,julia,sample,sampling,Random,Julia,Sample,Sampling,我想对k数字进行采样,其中第一个数字从1:n中采样,第二个从1:n-1中采样,第三个从1:n-2中采样,依此类推 我有下面的实现 function shrinksample(n,k) [rand(1:m) for m in n:-1:n-k+1] end Julia中是否有更快的解决方案?以下内容借鉴了randperm的实现思想,并且由于n和k具有相同的顺序,这是适当的,因为需要相同类型的随机性(两者都有大小为n阶乘的输出空间): 技巧主要是使用内部的Base.Random.rand\

我想对
k
数字进行采样,其中第一个数字从
1:n
中采样,第二个从
1:n-1
中采样,第三个从
1:n-2
中采样,依此类推

我有下面的实现

function shrinksample(n,k)
    [rand(1:m) for m in n:-1:n-k+1]
end

Julia中是否有更快的解决方案?

以下内容借鉴了
randperm
的实现思想,并且由于
n
k
具有相同的顺序,这是适当的,因为需要相同类型的随机性(两者都有大小为
n
阶乘的输出空间):


技巧主要是使用内部的
Base.Random.rand\u lt
而不是常规的
rand(1:n)

以下是从
randperm
的实现中得到的想法,并且由于
n
k
具有相同的顺序,这是适当的,因为需要相同类型的随机性(两者的输出空间大小均为
n
factorial):


技巧主要是使用内部
Base.Random.rand\u lt
而不是常规的
rand(1:n)

如果这对随机性不太敏感(您没有进行加密),那么以下操作应该非常快且非常简单:

blazingshrinksample(n,k) = (Int)[trunc(Int,(n-m)rand()+1) for m in 0:k-1]
在您的实现和Dan的实现中进行测试,我得到了以下结果:

using BenchmarkTools

@btime shrinksample(10000,10000);
  259.414 μs (2 allocations: 78.20 KiB)

@btime fastshrinksample(10000,10000);
  66.713 μs (2 allocations: 78.20 KiB)

@btime blazingshrinksample(10000,10000);
  33.614 μs (2 allocations: 78.20 KiB)

如果这对随机性不太敏感(您没有进行加密),那么以下操作应该非常快速和简单:

blazingshrinksample(n,k) = (Int)[trunc(Int,(n-m)rand()+1) for m in 0:k-1]
在您的实现和Dan的实现中进行测试,我得到了以下结果:

using BenchmarkTools

@btime shrinksample(10000,10000);
  259.414 μs (2 allocations: 78.20 KiB)

@btime fastshrinksample(10000,10000);
  66.713 μs (2 allocations: 78.20 KiB)

@btime blazingshrinksample(10000,10000);
  33.614 μs (2 allocations: 78.20 KiB)

我不认为你的函数在做你所说的,但你所要求的仍然是更快的way@zombie修复了我的代码中的错误为什么不像你的问题所说的那样,只对1:k中的m使用
[rand(1:n-m)]
呢?
n
k
会是什么?与
n
相比,
k
会很小吗?您将采集多少样本?这些参数对于优化非常重要。@MichaelK.Borregaard
[rand(1:n-m)for m in 0:k-1]
…我不认为您的函数正在执行您所说的操作,但仍然要求您执行更快的优化way@zombie修复了我的代码中的错误为什么不仅仅是
[rand(1:n-m)表示1:k中的m]
正如你的问题所说的那样?
n
k
会是什么?与
n
相比,
k
会很小吗?你会采集多少样本?这些参数对于优化非常重要。@MichaelK.Borregaard
[rand(1:n-m)表示0:k-1中的m]
…最好添加一个
@assert
k@assertn最好添加
@assert
k@assertN