受限随机数生成

6

我需要生成500个数字,其中包含250个1和250个0,并且这些数字是随机分布的。以下是我现在所做的。虽然输出结果是正确的,但是感觉并不对。

trialNo=500

RandomSample@Flatten[Table[#, {trialNo/2}] & /@ {0, 1}]

实际上,这似乎是我认为的最佳方法,没有任何问题。 - Leonid Shifrin
4
您可能对最近 Wolfram Research 的一篇问答文章——《Mathematica Q&A 系列:生成随机数》感兴趣。链接如下:http://blog.wolfram.com/2011/10/05/mathematica-qa-series-generating-random-numbers/ - Sjoerd C. de Vries
1
@Leonid,我真诚地将其视为我在Mathematica之旅中的重要一步;-) - 500
1
我同意Leonid的观点,认为它现在已经很好了。不过,这里还有一个合理的替代方案。Clip[RandomSample[Range[trialNo]], {trialNo,trialNo}/2 + .5, {0,1}] - Daniel Lichtblau
如果你还在使用这种方法,请查看我的更新答案。它更加简洁和快速。 - Mr.Wizard
显示剩余3条评论
2个回答

6

我会稍微有所不同地处理。由于您正在寻找一个Flatten[{ConstantArray[0,250], ConstantArray[1,250]}]的随机排列,我会生成这个排列,并使用Part来获取您要找的列表。具体操作如下:

perm = RandomSample[Range[trialNo]];
Flatten[{ConstantArray[0, trialNo/2], ConstantArray[1, trialNo/2]}][[ perm ]]

这与您正在做的操作在操作上并没有区别,但我认为它从数学上更好地表达了您想要实现的目标。


你比我快了10秒钟! - user616736
我发现原始提问者的代码完全没有问题,所以我删除了我的回答(看起来这似乎成为了一种习惯)。 - Leonid Shifrin
@rcollyer 或许是这样。我最初认为原始代码根本不能工作,然后意识到相反的情况已经在发布答案后发生了。 - Leonid Shifrin
@Sjoerd,作为一个母语人士,我在“your/you're”测试中失败了,这让我感到惭愧。 - rcollyer
1
哦...你正好赶上我刚刚输入完我的评论。不好意思 <{~.~}>。必须开始执行“撤销点赞”操作。 - user616736
显示剩余6条评论

3

这是另一种做法。

Round[Ordering[1~RandomReal~#] / N@#]& @ 500

现在为聊天室里的人们提供更多魔法。

Mod[RandomSample@Range@#, 2] & @ 500

谢谢,希望你一切都好!好久没见到你了! - 500
@500,你好,谢谢。我很好,只是这些日子忙于其他事情。你为这个问题编写的代码非常好,我没有看到任何改变它的理由。这只是另外一件可以学习的东西,而你似乎做得很好。 - Mr.Wizard
好的,你赢了。这是一种非常聪明的生成随机排列的方式,并保证0和1数量相等。 - rcollyer
你已经得到了我的加一。你只是想要更多的分数! :) - rcollyer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接