偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

生成隨機(jī)數(shù)的方式你選對(duì)了嗎?

開(kāi)發(fā) 后端
首先需要說(shuō)明的是,計(jì)算機(jī)中生成的隨機(jī)數(shù)嚴(yán)格來(lái)說(shuō)都是偽隨機(jī),即非真正的隨機(jī)數(shù),真正隨機(jī)數(shù)的隨機(jī)樣本不可重現(xiàn)。那么我們來(lái)看看代碼中有哪些方式可以生成隨機(jī)數(shù)。

 [[286905]]

生成隨機(jī)數(shù)的N種方式

首先需要說(shuō)明的是,計(jì)算機(jī)中生成的隨機(jī)數(shù)嚴(yán)格來(lái)說(shuō)都是偽隨機(jī),即非真正的隨機(jī)數(shù),真正隨機(jī)數(shù)的隨機(jī)樣本不可重現(xiàn)。那么我們來(lái)看看代碼中有哪些方式可以生成隨機(jī)數(shù)。

rand

rand函數(shù)聲明如下:

  1. #include <stdlib.h> 
  2. int rand(void); 

rand函數(shù)返回[0,RAND_MAX)范圍的隨機(jī)整數(shù),在我的機(jī)器上,RAND_MAX為2147483647。

使用示例:

  1. rand.c 
  2. */ 
  3. #include<stdlib.h> 
  4. #include<stdio.h> 
  5. int main(void) 
  6.     int i = 0; 
  7.     while(i < 5) 
  8.     { 
  9.         printf("%d ",rand()); 
  10.         i++; 
  11.      } 
  12.     printf("\n"); 
  13.     return 0; 

編譯運(yùn)行:

  1. $ gcc -o rand rand.c 
  2. ./rand 
  3. 1804289383 846930886 1681692777 1714636915 1957747793 

多運(yùn)行幾次,你就會(huì)驚喜地發(fā)現(xiàn),每次運(yùn)行的結(jié)果都是一樣的!!!這還玩?zhèn)€毛線?

srand

別急,rand雖然每次運(yùn)行的結(jié)果都是一樣的,那是因?yàn)樗姆N子默認(rèn)為1。每一個(gè)種子會(huì)有一串看似隨機(jī)的序列,每次取下一個(gè)出來(lái),整體都近乎是隨機(jī)分布的。但是如果你的種子每次都是一樣的,那么每次運(yùn)行可能得到的結(jié)果也是一樣的。我們需要利用srand給它一個(gè)種子。

  1. #include <stdlib.h> 
  2. void srand(unsigned int seed); 

為了保證我們每次的得到的隨機(jī)數(shù)不一樣,我們必須在每次調(diào)用時(shí),都確保種子不一樣,因此通常會(huì)選擇使用時(shí)間作為種子,注意這只是通常的種子選擇,你可以根據(jù)實(shí)際使用需求進(jìn)行選擇。

于是我們?cè)谑褂弥霸O(shè)置好種子,使用示例:

  1. rand.c 
  2. */ 
  3. #include<stdlib.h> 
  4. #include<stdio.h> 
  5. #include<time.h> 
  6. int main(void) 
  7.     srand(time(NULL));//設(shè)置隨機(jī)種子,注意只需要設(shè)置一次即可 
  8.     int i = 0; 
  9.     while(i < 5)//生成5個(gè)隨機(jī)數(shù) 
  10.     { 
  11.         printf("%d ",rand()); 
  12.         i++; 
  13.      } 
  14.     printf("\n"); 
  15.     return 0; 

現(xiàn)在好了,每次運(yùn)行生成的都不一樣了。但是還有一個(gè)問(wèn)題,如果這種方式在多線程下使用,也是不可取的,因?yàn)閞and不是可重入函數(shù)。它的每次調(diào)用都會(huì)修改一些隱藏的屬性,因此在多線程中使用它并不合適。

rand_r

為了在多線程下使用,我們使用rand_r,使用方式和rand是一樣的:

  1. #include <stdlib.h> 
  2. int rand_r(unsigned int *seedp); 

使用示例:

  1. #include<stdlib.h> 
  2. #include<stdio.h> 
  3. #include<time.h> 
  4. int main(void) 
  5.     unsigned int seed = time(NULL); 
  6.     int i = 0; 
  7.     while(i < 5)//生成5個(gè)隨機(jī)數(shù) 
  8.     { 
  9.         printf("%d ",rand_r(&seed)); 
  10.         i++; 
  11.     } 
  12.     printf("\n"); 
  13.     return 0; 

多線程中,多個(gè)線程可能幾乎同時(shí)調(diào)用,那它們的種子可能也一樣,如果想不一樣,還可以將種子設(shè)置成和線程id有關(guān)。

  1. unsigned int seed  = time(NULL)^pthread_self();  

random

通過(guò)前面的例子可以發(fā)現(xiàn),rand生成的整數(shù)范圍是有限的,為了生成更大范圍,可以使用random:

  1. #include <stdlib.h> 
  2. long int random(void); 
  3. void srandom(unsigned int seed); 

random返回的類型為long int,因此在一定程度上,它生成的范圍要大得多。另外與rand類似,需要使用srandom函數(shù)設(shè)置種子。具體的例子就不再放出了。

生成指定范圍隨機(jī)數(shù)

前面的例子都是生成[1,RAND_MAX]之間的數(shù),如果要生成指定區(qū)間的隨機(jī)數(shù)呢?假設(shè)a和b不超過(guò)int范圍以及它們的差值不超過(guò)rand的生成范圍。

[a,b)

左閉右開(kāi)區(qū)間,即包含a,不包含:

  1. (rand() % (b - a)) + a; 

[a,b]

左閉右閉,即包含a和b:

  1. (rand() % (b - a + 1)) + a; 

(a,b]

左開(kāi)右閉,即不包含a,包含b:

  1. (rand() % (b-a)) + a + 1; 

[0,b]

  1. rand() % b ; 

0到1之間的浮點(diǎn)數(shù)

  1. rand()/(double)RAND_MAX; 

舉例

生成[2,10)之間的隨機(jī)數(shù)5個(gè):

  1. #include<stdlib.h> 
  2. #include<stdio.h> 
  3. #include<time.h> 
  4. int main(void) 
  5.     srand(time(NULL));//設(shè)置隨機(jī)種子,注意只需要設(shè)置一次即可 
  6.     int i = 0; 
  7.     int a = 2; 
  8.     int b = 10; 
  9.     while(i < 5)//生成5個(gè)隨機(jī)數(shù) 
  10.     { 
  11.         printf("%d ",( rand() % ( b - a ) )+ a); 
  12.         i++; 
  13.      } 
  14.     printf("\n"); 
  15.     return 0; 

總結(jié)

記住,通過(guò)這些方法生成的都是偽隨機(jī)數(shù)。而一個(gè)好的隨機(jī)算法,它的隨機(jī)性很強(qiáng),可能需要根據(jù)使用場(chǎng)景去設(shè)計(jì)具體的算法。本文所介紹的僅僅是庫(kù)函數(shù)提供的隨機(jī)數(shù)生成函數(shù)。

責(zé)任編輯:武曉燕 來(lái)源: 編程珠璣
相關(guān)推薦

2020-08-04 08:37:23

Kafka分區(qū)數(shù)

2019-05-28 11:52:43

可視化圖表數(shù)據(jù)

2015-01-26 10:55:56

云服務(wù)器PowerEdge C

2018-07-04 06:26:00

無(wú)線路由器網(wǎng)絡(luò)WiFi

2018-01-25 16:49:08

開(kāi)源容器云編排工具

2019-09-10 10:25:47

數(shù)據(jù)庫(kù)管理工具Valentina S

2011-07-15 11:15:29

上網(wǎng)行為管理

2013-07-30 09:16:59

2013-07-30 17:28:45

2024-11-01 15:51:06

2020-12-18 09:11:43

數(shù)據(jù)庫(kù)SQLNoSQL

2021-06-15 07:59:01

Java生成隨機(jī)數(shù)Java編程

2009-12-02 17:01:01

PHP隨機(jī)數(shù)rand()

2010-03-22 19:41:31

2021-04-06 08:54:13

Random線程安全數(shù)生成器

2019-09-11 10:09:00

Java虛擬機(jī)算法

2017-11-09 13:56:46

數(shù)據(jù)庫(kù)MongoDB水平擴(kuò)展
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)