如何在给定时间段内随机分配值?

时间:2013-10-30 16:41:31

标签: matlab math combinations permutation

我试图在随机的时间段内分配某个值。为了澄清更多,

假设我想在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可供分发)因为这会改变排列值吗?

谢谢你们!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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)

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

另请注意,他们已尝试在Generate a random number with max, min and mean (average) in Matlab中回答类似问题。