【问题标题】:Create a matrix of random integers with equal number of occurrences for each integer创建一个随机整数矩阵,每个整数出现的次数相等
【发布时间】:2018-08-10 20:41:44
【问题描述】:

我正在使用 matlab 创建一个由 1 到 5 的随机整数组成的矩阵,其中每个整数的次数相等,这样矩阵中 4 的数量与 5 的数量相同。平均加权值不起作用,因为它仍然会产生每个数字的不相等出现。有人可以帮忙吗?

【问题讨论】:

  • MATLAB 能否生成给定大小的随机排列?在 Python+NumPy 中,我会减少一个模 5 的排列(然后加一个):np.random.permutation(20)%5+1 -> array([1, 2, 3, 2, 1, 4, 1, 5, 3, 2, 5, 4, 5, 1, 5, 4, 4, 2, 3, 3])

标签: matlab random integer


【解决方案1】:
numbers = repmat([1:5], 1, 5);
reshape(numbers(randperm(length(numbers))), [5,5])

这将创建一个 1 到 5 的向量并重复 5 次,因此对于 5x5 矩阵来说已经足够了。可以将 5 更改为您需要的任何大小的矩阵。然后随机挑选它们以使向量随机。最后,它被重新整形为一个 5x5 的矩阵。

【讨论】:

  • 谢谢你完美的工作。是否可以使随机向量没有立即重复的整数?所以 1 永远不会跟随 1、2 永远不会跟随 2 等等?
  • stackoverflow.com/questions/29885347/… 这个链接似乎可以满足您的需求。您可以制作矢量,然后将其重塑为 5x5 以获得您想要的。
【解决方案2】:

这是一个生成这样一个 R 行和 C 列矩阵的代码。这不是最有效的代码,但它很容易理解,并且即使相等不能完美(即如果 R*C 不是 5 的倍数)也能正常工作:

R = 5;
C = 10;
M = -1 * ones(R, C);
affected = 0;
while affected < R*C
    r = randi([1,R]);
    c = randi([1,C]);
    if M(r, c) == -1
        M(r, c) = 1 + mod(affected, 5); 
        affected = affected + 1;
    end
end

【讨论】:

  • 如果 R*C 不是 5 的倍数,那么根据定义,你不能拥有相等数量的整数 1 到 5,这是 OP 想要的,所以“好处”有点没有意义...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-09
  • 1970-01-01
  • 1970-01-01
  • 2012-04-29
  • 1970-01-01
  • 2018-05-23
  • 2021-06-27
相关资源
最近更新 更多