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

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

在一些统计分析和优化实验中,需要用到随机数,可是我们又无法得到真正的随机数。平时使用的都是伪随机数,是拿软件模拟的随机数。
比如,系统时间具有随机性,常常被用作位随机数种子。
利用matlab可以很方便的生成伪随机数,用来做统计抽样等各种实验。
比如,你要在1-100整数中随机抽取42个不重复的样本。显然,这是一个典型的不放回抽样。如果单纯生成42个随机数,很容易,一行代码就可以解决。然而,大多时候,为了让我的随机抽样实验更加经得起别人的验证,我们需要想办法,让这个抽样可以复现,也就是说,让别人直到,我们的随机抽样不是靠心情人工瞎选的。

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

rng('default');%先将随机数生成器设置为默认值
rng(6);%设置伪随机数种子为6
randsample(100,42);%进行随机抽样
结果如下:
     12395    82     4    21    73    84    48     5    91    27    71    77    79    64    57    53    74    93    30    81    39    33    52

  244296    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,matlab)