成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

生成隨機數的方式你選對了嗎?

開發 后端
首先需要說明的是,計算機中生成的隨機數嚴格來說都是偽隨機,即非真正的隨機數,真正隨機數的隨機樣本不可重現。那么我們來看看代碼中有哪些方式可以生成隨機數。

 [[286905]]

生成隨機數的N種方式

首先需要說明的是,計算機中生成的隨機數嚴格來說都是偽隨機,即非真正的隨機數,真正隨機數的隨機樣本不可重現。那么我們來看看代碼中有哪些方式可以生成隨機數。

rand

rand函數聲明如下:

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

rand函數返回[0,RAND_MAX)范圍的隨機整數,在我的機器上,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; 

編譯運行:

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

多運行幾次,你就會驚喜地發現,每次運行的結果都是一樣的!!!這還玩個毛線?

srand

別急,rand雖然每次運行的結果都是一樣的,那是因為它的種子默認為1。每一個種子會有一串看似隨機的序列,每次取下一個出來,整體都近乎是隨機分布的。但是如果你的種子每次都是一樣的,那么每次運行可能得到的結果也是一樣的。我們需要利用srand給它一個種子。

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

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

于是我們在使用之前設置好種子,使用示例:

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

現在好了,每次運行生成的都不一樣了。但是還有一個問題,如果這種方式在多線程下使用,也是不可取的,因為rand不是可重入函數。它的每次調用都會修改一些隱藏的屬性,因此在多線程中使用它并不合適。

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個隨機數 
  8.     { 
  9.         printf("%d ",rand_r(&seed)); 
  10.         i++; 
  11.     } 
  12.     printf("\n"); 
  13.     return 0; 

多線程中,多個線程可能幾乎同時調用,那它們的種子可能也一樣,如果想不一樣,還可以將種子設置成和線程id有關。

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

random

通過前面的例子可以發現,rand生成的整數范圍是有限的,為了生成更大范圍,可以使用random:

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

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

生成指定范圍隨機數

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

[a,b)

左閉右開區間,即包含a,不包含:

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

[a,b]

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

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

(a,b]

左開右閉,即不包含a,包含b:

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

[0,b]

  1. rand() % b ; 

0到1之間的浮點數

  1. rand()/(double)RAND_MAX; 

舉例

生成[2,10)之間的隨機數5個:

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

總結

記住,通過這些方法生成的都是偽隨機數。而一個好的隨機算法,它的隨機性很強,可能需要根據使用場景去設計具體的算法。本文所介紹的僅僅是庫函數提供的隨機數生成函數。

責任編輯:武曉燕 來源: 編程珠璣
相關推薦

2020-08-04 08:37:23

Kafka分區數

2019-05-28 11:52:43

可視化圖表數據

2015-01-26 10:55:56

云服務器PowerEdge C

2018-07-04 06:26:00

無線路由器網絡WiFi

2018-01-25 16:49:08

開源容器云編排工具

2011-07-15 11:15:29

上網行為管理

2019-09-10 10:25:47

數據庫管理工具Valentina S

2013-07-30 09:16:59

2013-07-30 17:28:45

2024-11-01 15:51:06

2021-06-15 07:59:01

Java生成隨機數Java編程

2020-12-18 09:11:43

數據庫SQLNoSQL

2010-03-22 19:41:31

2009-12-02 17:01:01

PHP隨機數rand()

2017-11-09 13:56:46

數據庫MongoDB水平擴展

2021-04-06 08:54:13

Random線程安全數生成器

2017-05-29 09:56:25

2024-12-17 15:00:00

字符串Java

2019-09-11 10:09:00

Java虛擬機算法
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 人人干天天干 | 亚洲综合中文字幕在线观看 | 久久精品国产一区二区电影 | 亚洲精品大全 | 日韩精品视频一区二区三区 | 中文字幕国产日韩 | 精品亚洲91 | 国产精品日产欧美久久久久 | 精品国产乱码久久久久久闺蜜 | 九色国产 | 四色永久 | 国产高清一区二区 | 激情视频网站 | 国产又爽又黄的视频 | 欧美一区二区三区在线观看视频 | 欧美一级三级在线观看 | 激情91| 精品欧美乱码久久久久久 | 久久久噜噜噜www成人网 | 成人特区 | 久久看看 | 久久久久久亚洲精品 | 亚洲国产欧美精品 | 欧美成人久久 | 99热欧美 | 日本视频在线播放 | 亚洲在线免费 | 国产偷录视频叫床高潮对白 | 成年男女免费视频网站 | 成年人黄色一级毛片 | 久久久影院 | 天堂一区二区三区 | 欧美一区二区三区四区视频 | 久热精品在线观看视频 | 精品99爱视频在线观看 | 拍戏被cao翻了h承欢 | 国产精品揄拍一区二区 | 看羞羞视频 | 在线激情视频 | 午夜影院网站 | 超碰在线播 |