【问题标题】:Random unique integer values随机唯一整数值
【发布时间】:2013-11-20 08:30:35
【问题描述】:

有没有randi 的替代品,我需要唯一 整数值。使用randiPianoSperimentale 矩阵可能包含重复的整数值。

lover_bound = 10;
upper_bound = 180;
steps = 10;
NumeroCestelli = 8; 

livello = [lover_bound:steps:upper_bound];
L = length(livello);
n_c = 500 000
NumeroCestelli = 8

randIdxs = randi([1,L],n_c,NumeroCestelli);
PianoSperimentale = single(livello(randIdxs)); 

替代方案需要快速并支持非常大的矩阵。过去我用这个:

[PianoSperimentale] = combinator(L,NumeroCestelli,'c','r');

for i=1:L
    PianoSperimentale(PianoSperimentale==i)=livello(i);
end

但是太慢太痛苦了。 (见Combinator

【问题讨论】:

    标签: matlab random matrix


    【解决方案1】:

    是的,有:

    randsample(10,3)
    

    给出一个从 1 到 10 的 3 个整数的 向量,无需替换。

    如果你需要一个矩阵而不是一个向量:

    matrix = NaN(8,12);
    matrix(:) = randsample(1000,numel(matrix));
    

    给出一个 8x12 矩阵,其中包含从 1 到 1000 的唯一整数。

    函数randsample 在统计工具箱中。如果您没有它,您可以改用randperm,正如@RodyOldenhuis 和@Dan 所指出的那样(请参阅@Dan 的回答)。

    【讨论】:

    • +1,但请注意这是统计工具箱的一部分。
    • 我对这种方法有点吃力。使用上面的例子n_c = ceil((factorial(L+NumeroCestelli-1))/(factorial(NumeroCestelli)*factorial(L-1)));I 应该返回一个没有相等行的1081575x8 矩阵。所以[10 20 30 40 50 60 70 80] 等于[80 70 60 50 40 30 20 10],然后我的矩阵中应该只有一个。这应该可以正常工作吗? matrix = randsample(upper_bound,numel(NaN(n_c,NumeroCestelli)));
    • 如果我理解正确的话:[10 20 30 40 50 60 70 80] 在一行中的存在应该排除这 8 个值在任何其他行中的任何排列。这与您的要求非常不同。而且显然更难。如果这就是你想要的,我建议你将它作为一个单独的问题发布
    【解决方案2】:

    此外,如果您没有统计工具箱,那么您可以使用randperm

    randperm(m, k) + n - 1
    

    这还将为您提供 k 之间的随机整数 nn+m 而无需替换

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-16
      • 2017-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多