棘手的随机问题-需要帮助!

2个视图(过去30天)
鲁珀特•施泰因迈尔
鲁珀特•施泰因迈尔 2020年8月25日
亲爱的朋友们,
我正在努力解决以下问题:
我创建了80对数字。这些配对应保持不变,但配对顺序应随机化。
所以,我有一个包含这些配对的变量:sequence=[配对1配对2配对3等等]。
如何随机排列这些配对的顺序?例如,它看起来是这样的:随机化的_序列=[配对\u 2配对\u 3配对\u 1….]
现在是棘手的部分:
配对的数量从1到40。从1到40的每个数字都与1到40之间的一个随机偶数和1到40之间的一个随机不均匀数组合。例如,对于1,我可以使用配对1和18以及配对1和9。但是1不能与1配对!没有一个数字可以与其自身相匹配。此外,1不得与2配对,2不得与1配对,顺序无关紧要。3不得与4配对,5不得与6配对,以此类推,直到39不得与40配对,每次,顺序都不重要。因此,39和40不可能像40和39一样。
不能配对的数字有:
1 2 | 3 4 | 5 6 | 7 8 | 9 10 | 11 12 | 13 14 | 15 16 | 17 18 | 19 20 | 21 22 | 23 24 | 25 26 | 27 28 | 29 30 | 31 32 | 33 34 | 35 36 | 37 38 | 39 40
例如,2和3可以配对!
现在的问题是,如果我有这两对14 16和16 9,并且在16 9之前的14 16落地的对的洗牌之后,我也有一个16 16配对,这一定不会发生。这种不需要的配对在洗牌过程中会发生很多。例如,14/16中的14不能前面加14或13,14/16中的16不能后面加16或15。
我在考虑编写类似这样的代码:“如果1后面跟/前面跟1或2,那么再次洗牌。如果2后面跟/前面跟1或2,那么再次洗牌。如果3后面跟/前面跟3或4,那么再次洗牌…”等等,直到“如果40后面跟/前面跟40或39,那么再次洗牌。”
你觉得呢,有办法做到吗?或者是一个更简单的解决方法,我没有想过?
我非常感谢任何帮助,这是困扰我,因为现在已经有一段时间了。
提前谢谢,
鲁珀特
7评论
Rik
Rik 2020年8月26日
这确实需要一段时间:如果你洗牌列表,20370次尝试,如果你不洗牌,884次尝试。

登录评论。

接受的答案

Rik
Rik 2020年8月26日
编辑:Rik 2020年9月10日
因为我们现在有了问题的正确定义,我们可以开始为解决方案编写代码了:
rng (1)%设置一个随机种子,以便结果可重复
N = 6;在此定义问题大小
all_ids = (1: N) ';
奇怪的= 1:2:N;甚至= 2:2:N;
这些是while条件中的步骤:
%step1=序列+模(序列,2);%将“舍入”为偶数:[1 2 3]-->[2 4]
找到每个连续数之间的差值
%step3=step2==0;%如果增量为零,则表示[12](或[21])或[22]
%任何无效的对将使整个序列无效
n=0;
序列= [1];%使用无效序列输入循环
任何(diff(序列+ mod(序列,2))= = 0)
n = n + 1;
pair_with_even =甚至(randi (N, 1))。”;
将_与_奇数=奇数配对(randi(end,N,1));
list_of_pairs = [all_ids pair_with_odd; all_ids pair_with_even];
list_of_pairs([1:2: 2:2:结束]:)= list_of_pairs;
序列=重塑(list_of_pairs。',1,[]);
终止
clc,fprintf('生成下面的序列采取%d尝试\n',n),fprintf(“%d”顺序);fprintf(' \ n ')
您还可以洗牌的顺序 list_of_pairs
打乱= list_of_pairs (randperm(结束):);
27日评论
鲁珀特•施泰因迈尔
鲁珀特•施泰因迈尔 5 .卡特彼勒
我提出了一个新问题!
这是链接:
https://de.mathworks.com/matlabcentral/answers/598429-tricky-randomization-issue-who-can-help

登录评论。

更多答案(1)

默罕默德·萨米
默罕默德·萨米 2020年8月25日
编辑:Rik 2020年8月25日
一个选项是生成一个比您需要的时间更长的序列,然后消除值,直到序列有效。此后,您可以获取所需的序列长度。如果较短,请再次生成并连接它。
DesiredLength = 200;
N=2*所需长度;
Seq=randi([140],N,1);
(任何(abs(diff(Seq))<=1))
I=[false;abs(diff(Seq))<=1];
Seq (I) = [];
如果(长度(Seq) < DesiredLength)
Seq=[Seq;randi([140],N,1)];
终止
终止
最终=序号(1:所需长度);
5评论
鲁珀特•施泰因迈尔
鲁珀特•施泰因迈尔 2020年8月26日
这是一个很好的想法,但如果两个数的绝对差是1,这个序列也可以有效。例如2可以在3之后或之前,4可以在5之后或之前,6可以在7之前,等等。
不能配对的数字有:
1 2 | 3 4 | 5 6 | 7 8 | 9 10 | 11 12 | 13 14 | 15 16 | 17 18 | 19 20 | 21 22 | 23 24 | 25 26 | 27 28 | 29 30 | 31 32 | 33 34 | 35 36 | 37 38 | 39 40

登录评论。

社区寻宝

在MATLAB Central中查找宝藏,了解社区如何帮助您!

开始打猎吧!