精华内容
下载资源
问答
  • 比如,使用uniform_int_distribution分布,表示将引擎产生的随机数字平均分布在某个范围内;而使用normal_distribution分布,则表示将这些随机数字正态分布在某个范围。相应地,引擎对象则负责根据分布对象确定的...

    在c++11中,一个随机数的产生需要由随机引擎(engine)对象和分布(distribution)对象两部分共同完成。其中,对象负责随机数的取值范围和分布。比如,使用uniform_int_distribution分布,表示将引擎产生的随机数字平均分布在某个范围内;而使用normal_distribution分布,则表示将这些随机数字正态分布在某个范围。相应地,引擎对象则负责根据分布对象确定的取值范围和分布产生相应的随机数字。当我们在程序中确定随机数产生所需要的引擎对象和分布对象后,就可以用引擎对象作为参数,调用 分布对象这个函数对象,从而得到我们所需要的随机数了。例如,网站登录验证码的产生就需要用到随机数:

    #include <random>
    #include <iostream>
    
    using namespace std;
    
    int main() {
        default_random_engine reng;
    
        uniform_int_distribution<int> uni_dist(0, 25);
    
        random_device rnd_device;
        reng.seed(rnd_device());
    
        const int n = 4;
        char code[n];
    
        cout << "请输入验证码" << endl;
    
        for (int i = 0; i < n; i++) {
            code[i] = 'A' + uni_dist(reng);
    
            cout << code[i];
        }
    
        system("pause");
        return 0;
    
    }
    展开全文
  • 代码随机生成count个不重复的随机数平均数约(max-min)/count。 目前有遍历list、遍历int[]、使用HashSet去重list返回、使用set去重int[]返回、使用LinkedHashSet 首先list效率肯定比int[]低,所以遍历list、...

    代码随机生成count个不重复的随机数,平均数约(max-min)/count。

    目前有遍历list、遍历int[]、使用HashSet去重list返回、使用set去重int[]返回、使用LinkedHashSet

    首先list效率肯定比int[]低,所以遍历list、HashSet+List一定比另2个低。LinkedHashSet返回时需要转成list或int[]用处不大

    所以推荐使用的有:

    ①如果count都小于100,则遍历int[]效率及内存最优

    ②如果count有大于100的,推荐HashSet+int[]组合(如果不清楚,推荐使用此方式)

    遍历list效率一直是最差的,不推荐使用

        /**
         * 随机count个不重复数据,包含min和max
         * HashSet+int[]组合,推荐使用
         */
        public static int[] randomNoRepeatSetInt(int min, int max, int count) {
            if (count < 1) {
                throw new IllegalArgumentException("count必须大于0");
            }
            if (max + 1 - min < count) {
                throw new IllegalArgumentException("范围必须大于count,不然怎么不重复?");
            }
            Random random = new Random();
            HashSet<Integer> set = new HashSet<>(count);
            int[] ints = new int[count];
            while (set.size() < count) {
                int next = nextNum(random, min, max);
                if (set.add(next)) {
                    ints[set.size() - 1] = next;
                }
            }
            return ints;
        }
    
        /**
         * 随机count个不重复数据,包含min和max
         * 遍历int[],count<100时内存效率最优
         */
        public static int[] randomNoRepeatInt(int min, int max, int count) {
            if (count < 1) {
                throw new IllegalArgumentException("count必须大于0");
            }
            if (max + 1 - min < count) {
                throw new IllegalArgumentException("范围必须大于count,不然怎么不重复?");
            }
            Random random = new Random();
            int[] ints = new int[count];//此处也可以直接用int数组
            int size = 0;
            continueThis:
            while (size < count) {
                int next = nextNum(random, min, max);
                for (int i = 0; i < size; i++) {
                    if (ints[i] == next) {
                        continue continueThis;//继续while
                    }
                }
                ints[size] = next;
                size++;
            }
            return ints;
        }
    
        /**
         * 随机count个不重复数据,包含min和max
         * 遍历List,效率一直最差,不推荐使用
         */
        public static List<Integer> randomNoRepeatList(int min, int max, int count) {
            if (count < 1) {
                throw new IllegalArgumentException("count必须大于0");
            }
            if (max + 1 - min < count) {
                throw new IllegalArgumentException("范围必须大于count,不然怎么不重复?");
            }
            Random random = new Random();
            ArrayList<Integer> list = new ArrayList<>(count);
            while (list.size() < count) {
                int next = nextNum(random, min, max);
                if (!list.contains(next)) {
                    list.add(next);
                }
            }
            return list;
        }
    
        private static int nextNum(Random random, int min, int max) {
            return random.nextInt(max + 1 - min) + min;
        }

    当然你也可以只用list然后遍历判断是否包含,感觉上节约个set对象,但你可以试试20个以上的数据我打包票上面最快 

    随机单条数据:

        /**
         * 范围内随机一个值,包含min和max
         */
        public static int nextNum(int min, int max) {
            if (max <= min) {
                throw new IllegalArgumentException("max必须大于min");
            }
            return nextNum(new Random(), min, max);//见上面的方法
        }

    可重复的就不多说了吧,直接fori然后nextNum就行了

     

    如果想平均数也要定制,见另一篇博客:https://blog.csdn.net/weimingjue/article/details/103698334

     

     

    展开全文
  • 概论百度百科给出的随机数的定义是:“随机数是专门的随机...计算机产生随机数的过程,是根据一个种子为基准,以某个递推公式推算出来的一系列,当递推的范围足够大、往复性足够强、又符合正态分布或平均分布时,我们

    概论

    百度百科给出的随机数的定义是:“随机数是专门的随机试验的结果”。当我们需要完成一个类似于抽奖的程序时,我们往往会借助随机数来实现目标,但实际情况下,计算机只能给我们提供伪随机数。
    所谓伪随机数,“是按照一定算法模拟产生的,其结果是确定的,是可见的”。计算机产生随机数的过程,是根据一个种子为基准,以某个递推公式推算出来的一系列数,当递推的范围足够大、往复性足够强、又符合正态分布或平均分布时,我们就可以认为这是一个近似的真随机数
    c语言中,头文件stdlib.h(c++中是cstdlib)为我们提供了rand函数来生成随机数和srand()来提供随机数种子。
    所谓种子可以看作随机数序列的名字,一个种子对应一串随机数序列,当种子不变时,就会按照随机数序列依次输出随机数。

    实例

    1.默认种子

    #include<cstdlib>
    #include<iostream>
    using namespace std;
    #define max 1
    #define min 10
    int main()
    {
        int i;
        for(i=0;i<10;i++){
            cout<<rand()<<endl;//生成随机数
        }
        return 0;
    }

    结果:
    41
    18467
    6334
    26500
    19169
    15724
    11478
    29358
    26962
    24464
    这个代码没有指定种子,所以第一次请求时,种子被设置为1,这个我们等一下可以看到

    2.为种子赋值

    2.1 循环内定种子

    void Rand21(){
        int i;
        for(i=0;i<10;i++){
            srand(1);
            cout<<rand()<<endl;
        }
    }

    41
    41
    41
    41
    41
    41
    41
    41
    41
    41
    这次的输出结果是是个41,因为我们在每一次输出随机数之前都为种子赋值,我们也可以知道,如果种子是默认值1,那么随机数序列的第一个值是41

    2.2 循环外定种子

    void Rand22(){
        int i;
        srand(1);
        for(i=0;i<10;i++){
            cout<<rand()<<endl;
        }
    }

    输出结果和第一类一致,原因是默认的种子就是1,因此如果我需要产生更类似于真随机的随机数,我们就需要让种子也变得“随机”

    2.3 循环外不定种子

    void Rand231(){
        int i;
        srand(time(NULL));
        for(i=0;i<10;i++){
            cout<<rand()<<endl;
        }
    }

    输出结果请大家自己测试,如果测试的频率很高的话,会发现各次数据的情况非常类似,数值之间的间隔也小,这就是由于时间相近导致的种子之间的差异小,随机数序列的差异也小

    因此我们套用两次进行运算。

    void Rand232(){
        int i,j;
        srand(time(NULL));
        j=rand()+rand();
        srand(j);
        for(i=0;i<10;i++){
            cout<<rand()<<endl;
        }
    }

    每次测试的结果之间的差距就大了很多,多次使用的随机样本更趋近于“真随机”。

    3.常见的取随机值的方法

    3.1 在1~n之间取随机数

    void Rand31(){
        int i,n;
        cin>>n;
        for(i=0;i<10;i++){
            cout<<1+(int)(n*rand()/RAND_MAX<<endl;
        }
    }//本样例用默认种子

    原理是rand()函数的取值范围是1~32767,所以对随机生成的数值对应比例缩小或放大,即可实现

    3.2 random(int)函数

    random(int)函数和rand(void)函数的区别显而易见,random(int)函数输出的是指定范围内的随机数,而相同点是也可以用randomSeed()来制定种子
    但需要注意的是,random函数不是标准库函数,vc、g++等编译器是不能识别的

    3.3通用随机数公式

    3.3.1 a~b之间的随机数

    前文所使用的公式

    a+(int)(b-a)*rand()/(RAND_MAX+1)//左闭右开
    a+(int)(b-a)*rand()/RAND_MAX//闭合区间

    对这个公式进行改良得到

    rand()%(b-a)+a//开闭区间为左闭右开
    rand()%(b-a)+a+1//开闭区间为左闭右开
    rand()%(b-a+1)+a//开闭区间为闭区间

    再由上面我们可以得到a~a+n的通用公式

    a+rand()%n//这个函数的区间问题请大家参考上面来思考

    3.3.2 0~1的小数

    rand()/(double)RAND_MAX

    由此推得a~a+1之间的小数

    rand()/(double)RAND_MAX+a

    在向外发展,结合3.3.1,a~b之间的小数

    rand()/(double)RAND_MAX+rand()%(b-a)+a

    总结

    以下要点需要在编写随机数程序过程中牢记
    1.rand函数的生成结果由种子决定,种子默认为1
    2.种子如果一定,那么随机的结果就会在完成一次循环后重复这一过程
    3.即使不断的选取种子,所产生的数值都是伪随机,计算机无法实现真正的“真随机”

    最后希望大家以后搞小活动的时候,如果需要随机数生成器,能自己编写一次属于自己的生成器,加个善意的小后门来做个小惊喜。

    展开全文
  • C语言--生成正态分布随机

    万次阅读 2012-09-02 17:56:06
    但如何根据平均分布的随机数进而产生其它分布的随机数呢?本文提出了一种基于几何直观面积的方法,以正态分布随机的产生为例讨论了任意分布的随机数的产生方法。  正文: 一、平均分布随机数的产生  ...
    摘要:

          随机数在实际运用中非常之多,如游戏设计,信号处理,通常我们很容易得到平均分布的随机数。但如何根据平均分布的随机数进而产生其它分布的随机数呢?本文提出了一种基于几何直观面积的方法,以正态分布随机数的产生为例讨论了任意分布的随机数的产生方法。


     正文:

    一、平均分布随机数的产生

          大家都知道,随机数在各个方面都有很大的作用,在vc的环境下,为我们提供了库函数rand()来产生一个随机的整数。该随机数是平均在0~RAND_MAX之间平均分布的,RAND_MAX是一个常量,在VC6.0环境下是这样定义的:

    #define RAND_MAX 0x7fff

         它是一个short 型数据的最大值,如果要产生一个浮点型的随机数,可以将rand()/1000.0这样就得到一个0~32.767之间平均分布的随机浮点数。如果要使得范围大一点,那么可以通过产生几个随机数的线性组合来实现任意范围内的平均分布的随机数。例如要产生-1000~1000之间的精度为四位小数的平均分布的随机数可以这样来实现。先产生一个0到10000之间的随机整数。方法如下 :


    int a = rand()%10000;

    然后保留四位小数产生0~1之间的随机小数:
    double b = (double)a/10000.0;
    然后通过线性组合就可以实现任意范围内的随机数的产生,要实现-1000~1000内的平均分布的随机数可以这样做:
    double dValue = (rand()%10000)/10000.0*1000-(rand()%10000)/10000.0*1000;

    则dValue就是所要的值。


         到现在为止,你或许以为一切工作都已经完成了,其实不然,仔细一看,你会发现有问题的,上面的式子化简后就变为:
    double dValue = (rand()%10000)/10.0-(rand()%10000)/10.0;
         这样一来,产生的随机数范围是正确的,但是精度不正确了,变成了只有一位正确的小数的随机数了,后面三位的小数都是零,显然不是我们要求的,什么原因呢,又怎么办呢。
         先找原因,rand()产生的随机数分辨率为32767,两个就是65534,而经过求余后分辨度还要减小为10000,两个就是20000而要求的分辨率为1000*10000*2=20000000,显然远远不够。下面提供的方法可以实现正确的结果:
              double a = (rand()%10000) * (rand()%1000)/10000.0;
              double b = (rand()%10000) * (rand()%1000)/10000.0;
              double dValue = a-b;

         则dValue就是所要求的结果。在下面的函数中可以实现产生一个在一个区间之内的平均分布的随机数,精度是4位小数。

    double AverageRandom(double min,double max)
              {
              int minInteger = (int)(min*10000);
              int maxInteger = (int)(max*10000);
              int randInteger = rand()*rand();
              int diffInteger = maxInteger - minInteger;
              int resultInteger = randInteger % diffInteger + minInteger;
              return resultInteger/10000.0;
              }

         但是有一个值得注意的问题,随机数的产生需要有一个随机的种子,因为用计算机产生的随机数是通过递推的方法得来的,必须有一个初始值,也就是通常所说的随机种子,如果不对随机种子进行初始化,那么计算机有一个确省的随机种子,这样每次递推的结果就完全相同了,因此需要在每次程序运行时对随机种子进行初始化,在vc中的方法是调用srand(int)这个函数,其参数就是随机种子,但是如果给一个常量,则得到的随机序列就完全相同了,因此可以使用系统的时间来作为随机种子,因为系统时间可以保证它的随机性。

         调用方法是srand(GetTickCount()),但是又不能在每次调用rand()的时候都用srand(GetTickCount())来初始化,因为现在计算机运行时间比较快,当连续调用rand()时,系统的时间还没有更新,所以得到的随机种子在一段时间内是完全相同的,因此一般只在进行一次大批随机数产生之前进行一次随机种子的初始化。下面的代码产生了400个在-1~1之间的平均分布的随机数。

         double dValue[400];
              srand(GetTickCount());
              for(int i= 0;i < 400; i++)
              {
              double dValue[i] = AverageRandom(-1,1);
              }


    二、任意分布随机数的产生

         下面提出了一种已知概率密度函数的分布的随机数的产生方法,以典型的正态分布为例来说名任意分布的随机数的产生方法。

         如果一个随机数序列服从一维正态分布,那么它有有如下的概率密度函数:


    (1-1)


    其中μ,σ( >0)为常数,它们分别为数学期望和均方差,如果读者对数学期望和均方差的概念还不大清楚,请查阅有关概率论的书。如果取μ =0,σ =0.2,则其曲线为






                        图2 正态分布的概率密度函数曲线


         从图中可以看出,在μ附近的概率密度大,远离μ的地方概率密度小,我们要产生的随机数要服从这种分布,就是要使产生的随机数在μ附近的概率要大,远离μ处小,怎样保证这一点呢,可以采用如下的方法:在图2的大矩形中随机产生点,这些点是平均分布的,如果产生的点落在概率密度曲线的下方,则认为产生的点是符合要求的,将它们保留,如果在概率密度曲线的上方,则认为这些点不合格,将它们去处。如果随机产生了一大批在整个矩形中均匀分布的点,那么被保留下来的点的横坐标就服从了正态分布。可以设想,由于在μ处的f(x)的值比较大,理所当然的在μ附近的点个数要多,远离μ处的少,这从面积上就可以看出来。我们要产生的随机数就是这里的横坐标。


         基于以上思想,我们可以用程序实现在一定范围内服从正态分布的随机数。程序如下:


              double Normal(double x,double miu,double sigma) //概率密度函数
              {
              return 1.0/sqrt(2*PI*sigma) * exp(-1*(x-miu)*(x-miu)/(2*sigma*sigma));
              }
              double NormalRandom(double miu,
              double sigma,double min,double max)//产生正态分布随机数
              {
              double x;
              double dScope;
              double y;
              do
              {
              x = AverageRandom(min,max);
              y = Normal(dResult, miu, sigma);
              dScope = AverageRandom(0, Normal(miu,miu,sigma));
              }while( dScope > y);
              return x;
              }


    参数说明:double miu:μ,正态函数的数学期望

                        double sigma:σ,正态函数的均方差

                        double min,double max,表明产生的随机数的范围

    用如上方法,取 μ=0,σ=0.2,范围是-1~1产生400个正态随机数

    我们,先产生4000个在0到4之间的正态分布的随机数,取μ=0,σ=0.2,再把产生的数据的数量做个统计,画成曲线,如下图5所示:






                         图5 μ=0, σ=0.2,范围在0~4时的4000个正态分布的随机数统计图


    从图5中也可以看出,在靠近 处的产生的个数多,远离 处的产生的数量少,该图的轮廓线和概率密度曲线的形状刚好吻合。也就验证了该方法的正确性。


    有了以上基础,也就用同样的方法,只要知道概率密度函数,也就不难产生任意分布的随机数,方法都是先产生一个点,然后进行取舍,落在概率密度曲线下方的点就满足要求,取其横坐标就是所要获取的随机数。



    展开全文
  • Math.Random 默认生成一个double类型的小数,可精确到小数点后16位 ,[0,1) //Math.random类生成一个≥0小于1的随机小数,精度根据接收它...1.无参数的nextInt()方法 随机平均生成一个小于2的32次方的,也可能生...
  • 从数据库中获取到处理员组后,根据组的大小生成随机数作为下标,返回该下标对应的处理员即可。 实现简单,但如果一天的单数不多,那这一天每个处理员分到手头上的工单就可能差别很大。 优化...
  • 思想: 1.首先生成1到n的数组A ...4.根据3中P1的顺序,生成随机数数组A1= 代码: #include #include #include //快速排序,平均时间复杂度o(nlog2n),最好为o(log2n),最坏为o(n2).是不稳定排序( 交换排序)
  • 6.编写程序,生成10个随机数,每个元素的值介于1到100之间,并计算所有元素的和、平均值。 7.编写程序,根据输入的行列数值,生成相应的矩阵(其中元素为随机数)。 8.编写程序实现打印100以内的素数。 1.编写程序...
  • 1使用内置函数和同余随机数生成函数生成随机数序列 2 PurePersuitProblem的模拟 3 SingleServerQueueSimulation +随机数的生成 4计算列表的中心值(平均值,中位,众数,方差,标准差,相关系数) 5模拟两台...
  • TensorFlow 函数

    2017-11-28 17:48:00
    一.TensorFlow随机数生成函数 随机函数生成的数组每个...tf.truncated_normal 正态分布,单如果随机出来的值便宜平均值超过2个标准差,那么这个会被重新随机。 tf.random_uniform 均匀分布。 tf.random_gamm...
  • 实验一流程控制.zip

    2020-06-23 11:40:37
    6.编写程序,生成10个随机数,每个元素的值介于1到100之间,并计算所有元素的和、平均值。 7.编写程序,根据输入的行列数值,生成相应的矩阵(其中元素为随机数)。 8.编写程序实现打印100以内的素数。
  • C++加密文本程序

    千次阅读 2018-12-13 20:31:25
    生成一个随机数(称作n);(占密码的前三位,统一把每一位加上97) 生成和原字符串大小同样多的数字(称作a),为了加密,把数字加上n;(占接下来的几位) 在原来每个字符上加上a中对应的值。(占最后几位) ...
  • 上面公式n可以是很大的一个,在t回合选择m个参与者并向他们发送全局模型Gt到他们的本地,在根据本地数据训练成Lt+1,本地把两者的差距发送到服务中心,上面的差距可以应用一个随机数来缩放,这个主要是中心来优化...
  • 本书侧重于函数的实战... 214 根据本月收入查询应采用税率和速算扣除 413 215 查找某销售员某月的销售业绩 415 216 制作员工工牌 416 217 查询最后入职的员工 418 218 查询某员工是否为本公司人员 419 219...
  • R语言经典实例(中+英)

    热门讨论 2014-12-03 18:46:15
     8.3 生成随机数 193  8.4 生成可再生的随机数 194  8.5 生成随机样本 196  8.6 生成随机序列 197  8.7 随机排列向量 198  8.8 计算离散分布的概率 198  8.9 计算连续分布的概率 200  8.10 转换概率为分位数...
  • 5.2.9 REPT——生成重复的字符 172 5.3 合并文本 173 5.3.1 CONCATENATE——将多个文本合并到一处 173 5.4 转换文本格式 174 5.4.1 ASC——将全角字符转换为半角字符 174 5.4.2 WIDECHAR——将半角字符转换为...
  • 与数据库直连,根据外部传入的SQL ID和SQL参数,从指定数据库中读取SQL模版,拼装成真实的SQL语句、执行,并将得到的结果放入缓存中。目的是减少数据库的压力。 该系统将支撑大量的SQL操作,性能自然成为备受关注的...
  • 实验8_ WSN定位技术.pdf

    2019-06-23 14:58:41
    在计算几何学里多边形的几何中心称为质心,多边形顶点坐标的平均值就是质心节点的坐标。 假设多边形定点位置的坐标向量表示为pi= (xi,yi)T,则这个多边形的质心坐标为: 例如,如果四边形 ABCD 的顶点坐标分别为 ...
  • //生成一个随机数 if (probability )//如果此随机数小于连边概率,则在此(i,j)节点对之间添加一条边,否则不添加边。 { count++; adjacentMatrix[i][j] = adjacentMatrix[j][i] = 1; } }...
  • │ │ 技巧269 生成除当前工作表外的工作表名称.xls │ │ 技巧270 对文本进行排序.xls │ │ 技巧271 MMULT函数应用.xls │ │ │ └─第27章-循环引用 │ 技巧273 记录单元格操作时间.xls │ 技巧274 产生...
  • 可设置每个红包最大值为剩余红包平均数(剩余红包金额 / 剩余红包数量)的 2 倍,红包最小值依然为 0.1 分; 开始分配红包时,如果剩余红包数量为 1,则直接返回剩余红包总...
  • 【综合计算显示】 综合计算并显示选中区域存储格的最大值、最小值、平均值、求和、存储格个、筛选状态下的的加总求和,以及显示选区包含的数字、字符、汉字的个数等信息。 【GB2转BIG5】 将选中区域存储格的简体...
  • 【综合计算显示】 综合计算并显示选中区域存储格的最大值、最小值、平均值、求和、存储格个、筛选状态下的的加总求和,以及显示选区包含的数字、字符、汉字的个数等信息。 【GB2转BIG5】 将选中区域存储格的简体字...
  • EXCEL集成工具箱V6.0

    2010-09-11 01:44:37
    【综合计算显示】 综合计算并显示选中区域存储格的最大值、最小值、平均值、求和、存储格个、筛选状态下的的加总求和,以及显示选区包含的数字、字符、汉字的个数等信息。 【GB2转BIG5】 将选中区域存储格的简体...
  • delphi 开发经验技巧宝典源码

    热门讨论 2010-08-12 16:47:23
    0106 使用Mean函数计算平均数 70 0107 求最大浮点数和最小浮点数 71 4.3 序数函数 72 0108 使用Odd函数改变StringGrid组件的奇偶行颜色 72 0109 使用Pred函数获取顺序类型表达式的前驱 72 0110 使用Succ...

空空如也

空空如也

1 2 3
收藏数 54
精华内容 21
关键字:

根据平均数生成随机数