您的位置:首页 > 编程语言 > MATLAB

Matlab 中伪随机数的生成以及可复现的不放回等概率随机抽样

2017-03-04 15:40 495 查看

Matlab 中伪随机数的生成以及可复现的不放回等概率随机抽样

在一些统计分析和优化实验中,需要用到随机数,可是我们又无法得到真正的随机数。平时使用的都是伪随机数,是拿软件模拟的随机数。

比如,系统时间具有随机性,常常被用作位随机数种子。

利用matlab可以很方便的生成伪随机数,用来做统计抽样等各种实验。

比如,你要在1-100整数中随机抽取42个不重复的样本。显然,这是一个典型的不放回抽样。如果单纯生成42个随机数,很容易,一行代码就可以解决。然而,大多时候,为了让我的随机抽样实验更加经得起别人的验证,我们需要想办法,让这个抽样可以复现,也就是说,让别人直到,我们的随机抽样不是靠心情人工瞎选的。

用matlab解决这个问题的方法有很多种,这里介绍我认为最方便的方法:

rng('default');%先将随机数生成器设置为默认值
rng(6);%设置伪随机数种子为6
randsample(100,42);%进行随机抽样
结果如下:
1 至 23 列

95    82     4    21    73    84    48     5    91    27    71    77    79    64    57    53    74    93    30    81    39    33    52

24 至 42 列

96    58     2    55     9    86    38   100    46    49    40    29    67    76    43    18     8    11    45


注:以后要用matlab实现这种随机抽样的时候,将种子定为6,都会得到这个结果。


但是,在其他软件下。不一定会是这个结果,因为不同软件生成伪随机数的原理可能不同。

另外,如何根据既定的随机数结果,反推得到开始的种子。这个问题原则上是可以解决的,以后有时间尝试一下。

另外,还想着得到一个具有特定规律的随机序列(此处略去目的),思路自然就是暴力搜索啊。让伪随机种子从1开始逐步递增,直到生成的随机序列复合要求的时候就停下来。然后,如愿得到了想要的结果,巧的是,伪随机种子是1的时候就得到了想要的结果。
代码如下:


k = 1;
thesize = 42;
thecase = 0;
thesample = {};
theindex = {};
thesort = {};
firsthalf=[];
lasthalf =[];
while (1)

rng('default');%先将随机数生成器设置为默认值
rng(k);%设置伪随机数种子为6
thesample{k} = randsample(100,42)%进行随机抽样
[thesort{k} theindex{k}] = sort(thesample{k});
firsthalf = theindex{k}(1:thesize/2);
lasthalf = theindex{k}(thesize/2+1:end);
%thecase=1:
if length(find(firsthalf==1))*length(find(firsthalf==3))*length(find(firsthalf==5))*length(find(lasthalf==2))*...
length(find(lasthalf==4))
thecase = 1;
end
if length(find(firsthalf==2))&length(find(firsthalf==4))&length(find(lastthalf==1))&...
length(find(lasthalf==3))&length(find(lasthalf==5))
thecase = 2;
end
if thecase
disp('the appreciate result has been found!');
break;
end
k=k+1;
end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  matlab