0

我正在尝试在随机时间段内分配某个值。为了进一步澄清,

假设我想在 30 天内分发产品 x 和 y。我有 1500 件产品 x 必须在 30 天内随机分发。1 天内可以分发的项目数量有限制,即最多 60 个。

我一直在尝试解决一些问题,但在这个问题上真的没有成功。我对编程真的很陌生,所以如果有人能指出我正确的方法,那将是一个真正的帮助。

作为附录,如果我要分发的项目超过 1 个(例如假设有 x、y 和 z)具有不同的值(例如 1500、1000、900),并且可以分发的项目数量有限制某一天(每天最多 150 次)这个逻辑是否仍然有效,或者我应该看看新的东西。此外,是否应该进行检查,例如假设分配了 100 个 x、20 个 y 和 30 个 z,然后减去该值(第二天我有 1400 个 x、980 个 y 和 870 个 z 可供分配)因为这会改变排列值?

感谢你们 !

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 回答
0

这是一种直观的方法,适用于 2D 数组,无需“randperm”:

N = 36000;    % for three hundred years
days = 30;    % days
elem = 1500;    % elements in ten years
min_x = 0;    % daily minimum
max_x = 60;    % daily maximum
tic
x = zeros(days, N);
for hh = 1:elem
  % Add new candidates
  inds = randi(days, N, 1);
  inds = ((1:N).' - 1) * days + inds;
  x(inds) = x(inds) + 1;
  % Check
  inds_chck = x > max_x;
  any_inds_chck = any(inds_chck);
  find_any_inds_chck = find(any_inds_chck);
  ctrl = numel(find_any_inds_chck);
  while ctrl>0
    % First remove baddies
    inds = inds(find_any_inds_chck);
    x(inds) = x(inds) - 1;
    % Then reassign to new candidates
    inds = randi(days, ctrl, 1);
    inds = (find_any_inds_chck.' - 1) * days + inds;
    x(inds) = x(inds) + 1;
    % Check again
    inds_chck = x(:, find_any_inds_chck) > max_x;
    any_inds_chck = any(inds_chck);
    find_any_inds_chck = find(any_inds_chck);
    ctrl = numel(find_any_inds_chck);
  end
end
toc

但价格是一个奇怪的概率函数:

hist(x(:), max_x - min_x + 1)

请注意,约束对自由度也有明显影响。

另请注意,他们已尝试在 Matlab 中生成具有最大值、最小值和平均值(平均值)的随机数中回答类似的问题。

于 2013-11-01T21:59:09.897 回答