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 要素のベクトルを生成しようとすると、常に行き詰まります。

関数の実行時間が長すぎます。

これが私が行った試みの1つです:

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

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 に答える