zoukankan      html  css  js  c++  java
  • C语言之实现随机数产生算法

    随机数,也就是在不同的时刻产生不同的数值。

    在UNIX操作系统和window的操作系统上,我们知道有一个函数rand,它就是用来产生随机数的函数API接口,那么它的原理怎样实现?

    假设约定a1=f(seed),an+1=f(an),那么能够得到一个序列a1,a2,a3..an,那么要制作一个伪随机函数rand,仅仅须要让它每调用一次就返回序列的下一个元素即可。事实上就是相当于第1次调用rand返回a1。第2次返回a2,…,第n次返回an。这样每次返回的数值都不一样,也就是相当于随机数了。可是事实上不是真正的随机数。真正的随机数是使用物理现象产生的:比方掷钱币、骰子、转轮、使用电子元件的噪音、核裂变等等。

    这种随机数发生器叫做物理性随机数发生器。它们的缺点是技术要求比較高。

          在当前的计算机领域,许很多多的随机数算法正是基于这种原理产生,普通情况下我们在平时使用rand函数的时候,须要种钟子,也就是种随机数种子,确保每一次产生的数值不一样。这时候我们须要一个srand()的函数。然后在一定的时间里time()函数产生不同的序列。

          一般在写的时候是这样:srand(time(NULL)) ;这样就相当于种种子。接下来我们来看一下详细的代码:

    #include <stdio.h>
    #include <time.h>
    static unsigned int randseed;
    /* 实现伪随机数的支持 */
    unsigned int Curl_rand(void)
    {
      unsigned int r;
      /* 返回一个无符号32位整型的伪随机数. */
      r = randseed = randseed * 1103515245 + 12345;
      return (r << 16) | ((r >> 16) & 0xFFFF);
    }
    
    void Curl_srand(void)
    {
      /* 产生随机的伪随机数序列。 */
      randseed = (unsigned int) time(NULL);
      Curl_rand();
      Curl_rand();
      Curl_rand();
    }
    
    int main(void)
    {
    	srand();
    	unsigned int i ;
    	int j = 10;
    	printf("产生10个随机数:
    ");
    	while(j != 0){
    		i = Curl_rand() % 100 ;
    		printf("i:%d
    ",i);
    		j-- ;
    	}
    	return 0 ; 
    } 
    运行结果:


    假设不用这种算法,我们调用系统实现的接口是这样:

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    int main(void)
    {
    	//种种子 
    	srand(time(NULL));
    	int i ;
    	int j ;
    	for(i = 0 ; i < 10 ; i ++)
    	{
    		//产生10个100以内的随机数 
    		j = rand()%100 ;
    		printf("j:%d
    ",j);
    	} 
    	return 0 ;
    }
    执行结果:



            


  • 相关阅读:
    CSS3中新增的对文本和字体的设置
    PAT1107:Social Clusters
    Git的一些操作
    PAT1029:Median
    PAT1024:Palindromic Number
    PAT1028:List Sorting
    PAT1035: Password
    PAT1133:Splitting A Linked List
    PAT1017:Queueing at Bank
    PAT1105:Spiral Matrix
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/7100412.html
Copyright © 2011-2022 走看看