魔方吧·中文魔方俱乐部

 找回密码
 注册
搜索
热搜: 魔方
楼主: yang_bigarm
打印 上一主题 下一主题

监狱长给犯人们出的难题 [复制链接]

积分
3
帖子
3
精华
0
UID
1239870
性别
保密
1#
发表于 2009-10-21 01:42:10 |显示全部楼层
  1. (*总人数*)
  2. renshu = 100;
  3. (*实验次数:*)
  4. cishu = 10000;

  5. chenggong = 0;
  6. For[kk = 1, kk <= cishu, kk++,
  7. qiutu = {};
  8. hezi = {};
  9. haoma = Table[i, {i, 1, renshu}];
  10. For[ii = 1, ii <= renshu, ii++,
  11. fanghaoma = RandomInteger[{1, Length[haoma]}];
  12. AppendTo[hezi, haoma[[fanghaoma]]];
  13. haoma = Delete[haoma, fanghaoma];
  14. ];
  15. For[ii = 1, ii <= renshu, ii++,
  16. For[jj = 1, jj <= renshu/2, jj++;,
  17. If[Length[qiutu] < ii,
  18. AppendTo[qiutu, {hezi[[ii]]}],
  19. AppendTo[qiutu[[ii]], hezi[[Last[qiutu[[ii]]]]]];
  20. ];
  21. If[Last[qiutu[[ii]]] == ii, Break[]];
  22. ];
  23. If[jj > renshu/2, Break[]];
  24. ];
  25. If[Length[qiutu] == renshu, chenggong += 1(*; Print[qiutu]*);];
  26. ];
  27. Print["成功次数" <> ToString[chenggong]];
  28. Print["实验总次数" <> ToString[cishu]];
  29. Print["成功的概率" <> ToString[chenggong/cishu // N]];
复制代码
虽然不是很清楚所谓的数字环的理论,但是我觉得这种方法还是不错的.上面是我按照该思想做的Mathematica 程序.当然未必是最短的程序,但是实验次数不是很多时,还是可以出结果的.
成功次数3108
实验总次数10000
成功的概率0.3108
经历的时间是174秒,我还是可以接受这么长时间的.
程序中的(*; Print[qiutu]*)改成Print[qiutu]后可以输出成功时的抽取方法.但是如果实验次数很大时,输出会很长的.如果实验10次成功2~4次那么输出一下可以形象地看出抽取的过程.

[ 本帖最后由 ggggwhw 于 2009-10-21 09:27 编辑 ]

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

Archiver|手机版|魔方吧·中文魔方俱乐部

GMT+8, 2024-6-3 07:39

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部