0

ランダムな期間にわたって特定の値を配布しようとしています。さらに明確にするために、

製品 x と y を 30 日間にわたって配布したいとします。30 日間ランダムに配布する必要がある製品 x の 1500 アイテムがあります。1日に配布できるアイテム数は最大60個までと制限があります。

私は何かをスクラッチしようとしていますが、この問題では本当にうまくいきません. 私はプログラミングに本当に慣れていないので、誰かが私に正しいアプローチを教えてくれれば本当に助かります.

補足として、異なる値 (例: 1500、1000、900) を持つ複数のアイテム (x、y、z があるとします) を配布する場合、配布できるアイテムの数に制限があります。特定の日 (1 日あたり最大 150) は、このロジックがまだ機能するか、何か新しいものを見る必要があります。また、x が 100 個、y が 20 個、z が 30 個配布されていると仮定して、その値を減算します (翌日には、x が 1400 個、y が 980 個、z が 870 個が配布可能です)。これは順列値を変更しますか?

君たちありがとう !

4

2 に答える 2

0

これはあなたのために働くはずです!

days = 30;
elem = 1500;
max_x = 60; 

x = randi(max_x,days,1);
remain = elem - sum(x);

while remain > 0
   idx_1 = find(x < max_x);  % Numbers that can be increased
   idx_fill = randperm(numel(idx_1),remain);
   % idx_fill = idx_fill(:,1);    % Might be needed
   x(idx_1(idx_fill)) = x(idx_1(idx_fill)) + 1;
   remain = elem - sum(x);
end

while remain < 0
   idx_2 = find(x > 0);      % Numbers that can be reduced
   idx_red = randperm(numel(idx_2),abs(remain));
   % idx_red = idx_red(:,1);      % Might be needed
   x(idx_2(idx_red)) = x(idx_2(idx_red)) - 1;
   remain = elem - sum(x);
end

sum(x)
max(x)
min(x)

ans =  1500
ans =  60
ans =  34
于 2013-10-30T20:14:39.523 に答える