我试图在随机的时间段内分配某个值。为了澄清更多,
假设我想在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可供分发)因为这会改变排列值吗?
谢谢你们!
答案 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中回答类似问题。