算法1---随机生成算法

本文主的主要内容是一些随机算法,主要有四种,下面来详细的介绍:

1 生成随机数

一般c语言中提供了随机数生成函数,

其一是伪随机数--rand:用于返回一个0-32767之间的伪随机数;

其二是随机种子函数--srand:用来初始化随机数发生器的随机种子

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
    int i,j;
    srand((int)time(0));
    for (int i = 0; i < 10; i++)
    {
        for (int j = 0; j < 10; j++)
        {
            printf("%d  ",rand());
        }
        printf("\n");
    }
    return 0;
}

当然也可以生成一定范围内的随机数

比如生成0——100之间的随机数

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
    int i,j;
    srand((int)time(0));
    for (int i = 0; i < 10; i++)
    {
        for (int j = 0; j < 10; j++)
        {
            printf("%d  ",rand()*100/32767);
        }
        printf("\n");
    }
    return 0;
}

也可以生成100——200之间的随机数

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
    int i,j;
    srand((int)time(0));
    for (int i = 0; i < 10; i++)
    {
        for (int j = 0; j < 10; j++)
        {
            printf("%d  ",rand()/1000+100);
        }
        printf("\n");
    }
    return 0;
}

2 生成[0,1]之间均匀分布的随机数算法

在这里采用一种方式生成随机数

其中i=1,2,3.。。。

而pi就是地推倒的第i个随机数

根据经验,一般选取基数base=256.0,一般为2的整数倍;另外的两个常数选取a=17.0 和b=139.0

需要注意

(1)这里的取模运算是针对浮点型数据的,而c语言中的取模运算不能用于浮点数数据的操作,这样就需要用户自己编写取模的程序;

(2)ri是随着递推而每次更新的。因此,如果将这个算法编写出函数,需要考虑参数是传值还是传地址;

递推更新,所以在这里要传地址,否则得不到结果!

#include <stdio.h>

double rand0_1(double *r)
{
    double base=256.0;
    double a=17.0;
    double b=139.0;
    double temp1=a*(*r)+b;
    //printf("%lf",temp1);
    double temp2=(int)(temp1/base); //得到余数
    double temp3=temp1-temp2*base;
    //printf("%lf\n",temp2);
    //printf("%lf\n",temp3);
    *r=temp3;
    double p=*r/base;
    return p;
}

int main()
{
    double r=5.0;
    printf("output 10 number between 0 and 1:\n");
    for (int i = 0; i < 10; i++)
    {
        printf("%10.5lf\n",rand0_1(&r));
    }
    return 0;
}

3 产生任意范围内的随机数,比如产生[m,n]之间的随机数

这个很容易,只要将之前的[0,1]之间的随机数这样处理就行了

m+(m-n)*rand0_1(&r)就行了;

#include <stdio.h>

double rand0_1(double *r)
{
    double base=256.0;
    double a=17.0;
    double b=139.0;
    double temp1=a*(*r)+b;
    //printf("%lf",temp1);
    double temp2=(int)(temp1/base); //得到余数
    double temp3=temp1-temp2*base;
    //printf("%lf\n",temp2);
    //printf("%lf\n",temp3);
    *r=temp3;
    double p=*r/base;
    return p;
}

int main()
{
    double m=1.0,n=5.0;
    double r=5.0;
    printf("output 10 number between 0 and 1:\n");
    for (int i = 0; i < 10; i++)
    {
        printf("%10.5lf\n",m+(n-m)*rand0_1(&r));
    }
    return 0;
}

4 正态分布的随机数生成算法

符合正太分布的随机数在研究中也很重要,下面给出一种生成正态分布数的方法

其中Ri表示[0,1]之间均匀分布的随机数;

u为均值,  为方差,当n趋向于无穷大的时候,得到随机的随机分布为正态分布;

#include <stdio.h>
#include <math.h>

double rand0_1(double *r)
{
      double base=256.0;
      double a=17.0;
      double b=139.0;
      double temp1=a*(*r)+b;
      //printf("%lf",temp1);
      double temp2=(int)(temp1/base); //得到余数
      double temp3=temp1-temp2*base;
      //printf("%lf\n",temp2);
      //printf("%lf\n",temp3);
      *r=temp3;
      double p=*r/base;
      return p;
}

double random_normality(double u,double t,double *r ,double n)
{
      double total=0.0;
      double result;
      for (int i = 0; i < n; i++)
      {
            total+=rand0_1(r);
      }
      result=u+t*(total-n/2)/sqrt(n/12);
      return result;
}

int main()
{
      double r=5.0;
      double u=2.0;
      double t=3.5;
      double n=12;
      printf("output 10 number between 0 and 1:\n");
      for (int i = 0; i < 10; i++)
      {
            printf("%10.5lf\n",random_normality(u,t,&r,n));
      }
      return 0;
}

上面设计的代码都已经运行通过!

时间: 2024-10-24 21:10:50

算法1---随机生成算法的相关文章

试探算法_随机生成彩票号码

先给出一般的解决“随机生成7位1—29号数的彩票号码”问题的代码: 1 #include<stdio.h> 2 int main() 3 { 4 int j,i[7];//定义数组保存随机生成不同的7位数字 5 for(i[0]=1;i[0]<=29;i[0]++)//在1——29中随机生成不同的数字 6 for(i[1]=1;i[1]<=29;i[1]++) 7 { 8 if(i[1]==i[0]) continue; 9 for(i[2]=1;i[2]<=29;i[2]+

[迷宫中的算法实践]迷宫生成算法&mdash;&mdash;Prim算法

       普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (graph theory)),且其所有边的权值之和亦为最小.该算法于1930年由捷克数学家沃伊捷赫·亚尔尼克(英语:Vojtěch Jarník)发现:并在1957年由美国计算机科学家罗伯特·普里姆(英语:Robert C. Prim)独立发现:1959年,艾兹格·迪科斯彻再次发现了该算法.因此,在某些场合,普里姆

随机生成算法-小用

#pragma once#include <iostream>using namespace std;#include <ctime>#include <assert.h> namespace sorttesthelper{ int* generaterandomarray(int n, int rangl, int rangr) { assert(rangl <= rangr); int *arr = new int[n]; srand(time(NULL));

全排列的生成算法

[复制转载] //全排列的生成算法 // 全排列的生成算法就是对于给定的字符集,用有效的方法将所有可能的全排列无重复无遗漏地枚举出来.任何n个字符集的排列都可以与1-n的n个数字的排列一一对应, // 因此在此就以n个数字的排列为例说明排列的生成法. // n个字符的全体排列之间存在一个确定的线性顺序关系.所有的排列中除最后一个排列外,都有一个后继:除第一个排列外,都有一个前驱.每个排列的后继都可以从 // 它的前驱经过最少的变化而得到,全排列的生成算法就是从第一个排列开始逐个生成所有的排列的方

递归解决全排列生成算法

排列:从n个元素中任取m个元素,并按照一定的顺序进行排列,称为排列: 全排列:当n==m时,称为全排列: 比如:集合{ 1,2,3}的全排列为: { 1 2 3} { 1 3 2 } { 2 1 3 } { 2 3 1 } { 3 2 1 } { 3 1 2 } 方法一: 我们可以将这个排列问题画成图形表示,即排列枚举树,比如下图为{1,2,3}的排列枚举树,此树和我们这里介绍的算法完全一致: 算法思路: (1)n个元素的全排列=(n-1个元素的全排列)+(另一个元素作为前缀): (2)出口:如

(原创 untiy) 随机地牢生成算法(一)

转载注明出处:http://www.cnblogs.com/m-f-s/p/6509135.html 根据http://www.gamelook.com.cn/2015/12/239245 翻译整理  进行实现: 生成房间 首先,你要生成一些宽和高不同的房间,随机地放在一个圈内.TKdev的算法用了比较常见的方法随机生成房间尺寸,我认为这是一个不错的想法,因为它可以为你带来更多的参数可供使用,使用不同的宽高比例和标准偏差可以带来外观不同的副本地牢. 我采用此函数来返回一个半径为_r圆内的随机点:

【来写个2048吧】—— 移动算法与随机数字生成

一.移动算法 其实2048的移动算法蛮简单,看代码很容易明白,就不多说了. 向左滑动 //左滑动 bool GameScene:: doLeft () { //判断有没有发生移动 bool isMove = false ; for ( int y = 0 ; y < 4; y++) { for ( int x = 0 ; x < 4; x++) { for ( int x1 = x +1 ; x1 < 4; x1++) { if ( cardArr [x1 ][ y]-> getN

随机红包生成算法-python实现

抢红包那么开心,那你知道红包随机算法是怎么样的吗? 我模拟写了一个定额随机红包生成算法,如下. 输入: 红包总额,total 份数,num 调控参数(调控红包最平均差,默认为2) 约束: 每份最少有1分钱,即0.01 份数需为正整数 红包总额 <= 份数×0.01 输出 随机红包序列,序列长度等于红包份数 运气王,即红包数额最大的一份 # -*- coding: cp936 -*- # 思路:先随机出来m个数,然后平均分成m个数字只和的份数,然后将钱平均分给m个人# import random

随机生成32位字符串算法

随机生成32位字符串算法: function getRandom() { var arr = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D"