6

我想要完成的是以下内容:

我希望从相对较小的范围内创建一个整数向量,并确保没有一个整数后跟相同的整数。

即,这是一个“合法”向量:[ 1 3 4 2 5 3 2 3 5 4 ]

这是一个“非法”向量(因为 5 跟在 5 后面): [ 1 3 4 2 5 5 2 3 5 4 ]

我已经尝试过randi,以及各种变体randperm,当我尝试从一个小范围(即 1 到 5 之间的整数)生成大约 100 个元素的向量时,我总是卡住。

该功能运行时间过长。

这是我所做的尝试之一:

function result = nonRepeatingRand(top, count)

    result = randi(top, 1, count);

    while any(diff(result) == 0)
         result = randi(top, 1, count);    
    end

end

任何和所有的帮助将不胜感激。谢谢 !

4

5 回答 5

12

您正在寻找的序列类型可以通过生成差异来定义1top - 1然后计算累积和模数 top,从随机初始值开始:

function result = nonRepeatingRand(top, count)

    diff = randi(top - 1, 1, count);
    result = rem(cumsum(diff) + randi(1, 1, count) - 1, top) + 1;

end

在我的机器上,这会在 0.58 秒内以 1:5 的比例生成 1000 万个数字的非重复序列。

于 2013-10-28T20:17:52.640 回答
2

您可以使用以下代码生成从 1 到 M 的非重复随机数

随机烫发(M);

对于从 1 到 M 的 K 个非重复随机数

randperm(M, K);

请享用

于 2014-10-17T19:11:28.890 回答
1

不要每次都重新生成序列,但要修复重复。例如:

function result = nonRepeatingRand(top, count)

    result = randi(top, 1, count);

    ind = (diff(result) == 0);
    while any(ind)
        result(ind) = [];
        result(end + 1 : count) = randi(top, 1, count - numel(result));

        ind = (diff(result) == 0);
    end

end

在我的机器上,这会在 1.6 秒内以 1:5 的比例生成 1000 万个数字的非重复序列。

于 2013-10-28T20:05:39.433 回答
1

采用A. Donda的想法,但修复了实现:

r=[randi(top,1,1),randi(top - 1, 1, count-1)];
d=rem(cumsum(r)-1,top)+1;

的第一个元素r是随机选择的开始元素。以下元素r随机选择与前一个元素的差异,使用模运算。

于 2020-04-19T01:30:47.207 回答
0

这是怎么回事?

top = 5;
count = 100;
n1 = nan;
out = [];
for t = 1: count 
    n2 = randi(top);
    while n1 == n2
        n2 = randi(top);
    end
    out = [out, n2];
    n1 = n2;
end
于 2013-10-28T20:04:09.213 回答