【问题标题】:Pairs of random numbers Matlab随机数对 Matlab
【发布时间】:2018-01-28 22:14:14
【问题描述】:

我正在尝试使用 Matlab 的 randperm 并调用 randperm = 6 生成 1 到 6 之间的随机数。

每次这都会给我一个不同的数组,例如:

x = randperm(6)
x = [3 2 4 1 5 6]

我想知道是否有可能创建成对的随机数,最终得到x,例如:

x = [3 4 1 2 5 6]

我需要排列向量,使 1 和 2 始终彼此相邻,3 和 4 彼此相邻,5 和 6 彼此相邻。当我在Psychtoolbox 做某事时,这个顺序很重要。

是否可以有随机顺序的“块”?我不知道该怎么做。

谢谢

【问题讨论】:

  • 这对的顺序重要吗?例如,如果要选择一个由三个数字组成的块。例如,应该是严格意义上的1,2,3 吗?或者所有的组合也是可能的,它们是1,3,22,1,32,3,13,1,23,2,1
  • 严格来说并不重要,但如果我以后想实现它,最好知道该怎么做......
  • 添加了如何在每个块中随机排序以及如何在我的答案中按升序排列数字

标签: arrays matlab random psychtoolbox


【解决方案1】:
x=1:block:t ;    %Numbers
req = bsxfun(@plus, x(randperm(t/block)),(0:block-1).');  %generating random blocks of #
%or req=x(randperm(t/block))+(0:block-1).' ; if you have MATLAB R2016b or later
req=req(:);      %reshape

在哪里,
t = 总数
块 = 一个块中的数字

%Sample run with t=12 and block=3
>> req.'

ans =

    10    11    12     4     5     6     1     2     3     7     8     9

编辑:
如果您还希望每个块中的数字按随机顺序排列,请在上述代码的最后一行之前添加以下 3 行

[~, idx] = sort(rand(block,t/block));              %generating indices for shuffling
idx=bsxfun(@plus,idx,0:block:(t/block-1)*block);   %shuffled linear indices
req=req(idx);                                      %shuffled matrix

%Sample run with t=12 and block=3
req.'

ans =

     9     8     7     2     3     1    12    10    11     5     6     4

【讨论】:

  • 这看起来像是一个更通用的解决方案,但是这里每个块内的顺序是否相同?
  • @Steve 由于(0:block-1).' 部分,每个块中的数字将始终增加
  • 谢谢,这也是一个很好的解决方案。只是想为任何未来的读者添加我在一个循环中多次执行此操作,因此最好添加“rand('state',sum(100.*clock));”在脚本的开头,否则最终一切都会变得混乱。
  • @Maheen btw rand('state',sum(100.*clock)); 不鼓励 Mathworks。推荐的方式是rng('shuffle')See doc.
  • @Steve 还添加了如何在每个块中使用不同的顺序
【解决方案2】:

我可以看到一个简单的 3 步过程来获得您想要的输出:

  1. 制作2*randperm(3)
  2. 将值加倍
  3. randperm(2)-2(-1,0) 的随机排序对)添加到每对中。

在代码中:

x = randperm(3)
y = 2*x([1 1 2 2 3 3])
z = y + ([randperm(2),randperm(2),randperm(2)]-2)

结果

x = 3 1 2
y = 6 6 2 2 4 4
z = 6 5 2 1 3 4

【讨论】:

  • 啊,谢谢!只是一个简单的问题,重新排列是否容易,以便我按递增顺序排列它们,例如 1 2 和 3 4 而不是 4 3?
  • @MaheenSiddiqui 如果您希望始终在较大的数字对之前拥有较小的数字,则不要将 [randperm(2),randperm(2),randperm(2)]-2 添加到 y,而是添加 repmat([-1,0],1,3)(即 @987654329 @) 给它
猜你喜欢
  • 2010-12-25
  • 2013-10-10
  • 1970-01-01
  • 2016-05-09
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多