隨機數本質,C語言的隨機數與隨機種子

2020-12-17 專注物聯網知識

引言

在實際編程中,我們經常會用到隨機數這個概念,其實也是一個偽隨機數,實際上並不是一個真正的隨機數,但是也足夠我們使用了。在C語言中,編寫一些關於遊戲之類的程序時就需要用到隨機數了。同時C語言也提供了一個標準庫裡面一個函數來產生隨機數,而對於隨機數的產生是根據種子(根據一個數值按照某種公式計算的)來變化的,種子 與隨機數之間符合正態分布(高斯分布)。

@雲主宰蒼穹—正態分布

生成隨機數

在C語言中,我們一般使用 <stdlib.h> 頭文件中的 rand() 函數來生成隨機數,它的用法為:

int rand (void);【void是指不需要傳遞參數】

rand() 會隨機生成一個位於 0 ~ RAND_MAX 之間的整數。而對RAND_MAX 是 <stdlib.h> 頭文件中的一個宏,它用來指明 rand() 所能返回的隨機數的最大值。C語言標準並沒有規定 RAND_MAX 的具體數值,只是規定它的值至少為 32767。

生成隨機數實例

#include <stdio.h>

#include <stdlib.h>

int main()

{

int rands;

rands = rand();

printf("生成的隨機數為:%d\n",rands);

return 0;

}

但是這個隨機數一旦編譯之後就固定了,並不能滿足我們的實際需求,前面提到了只是一個偽隨機數,我們需要對產生隨機數的種子進行不斷的重播,從而達到我們實際需求的隨機數效果。我們可以通過 srand() 函數來重新「播種」,這樣種子就會發生改變。

srand() 的用法為:void srand (unsigned int seed);

它需要一個 unsigned int 類型的參數。在實際開發中,我們可以用時間作為參數,只要每次播種的時間不同,那麼生成的種子就不同,最終的隨機數也就不同,通常我們採用 <time.h> 頭文件中的 time() 函數即可得到當前的時間【精準到秒】srand((unsigned)time(NULL));

不斷產生新的隨機數實例

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

int main()

{

int rands;

srand((unsigned)time(NULL));

rands = rand();

printf("本次產生的隨機數為:%d\n", rands);

return 0;

}

小提示:根據種子與隨機數的符合高斯分布的關係可知,生成的隨機數是逐漸增大或者逐漸減小!

@雲主宰蒼穹—生成隨機數

生成一定範圍隨機數

在實際編程開發中,實際需求往往是一定範圍內的隨機數,對於產生一定範圍的隨機數,就需要使用一定的技巧了,而筆者常用的方法是取模運算,再加上一個加法運算:

int a = rand() % 10; //產生0~9的隨機數,注意10會被整除

如果要規定上下限:

int a = rand() % 51 + 100; //產生100~150的隨機數

分析:取模即取餘,rand()%51+13,看成兩部分:rand()%51是產生 0~50 的隨機數,後面+100保證 a 最小只能是 100,最大就是 50+100=150。

@雲主宰蒼穹—一定範圍的隨機數

相關焦點

  • 單片機C語言如何產生隨機數
    KEIL裡面產生隨機數的函數確實是rand(),但頭文件是stdlib.h,不是time.h。C語言提供了一些庫函數來實現隨機數的產生。 C語言中有三個通用的隨機數發生器
  • 單片機C語言如何產生隨機數?
    KEIL裡面產生隨機數的函數確實是rand(),但頭文件是stdlib.h,不是time.h。C語言提供了一些庫函數來實現隨機數的產生。C語言中有三個通用的隨機數發生器,分別為rand函數、random函數、randomize
  • C語言/C++中如何產生隨機數
  • 教您單片機C語言如何產生隨機數
    或者預先寫好一個隨機數表,然後進行取數據。也是可以的。  KEIL裡面產生隨機數的函數確實是rand(),但頭文件是stdlib.h,不是time.h。C語言提供了一些庫函數來實現隨機數的產生。C語言中有三個通用的隨機數發生器,分別為 rand函數、random函數、randomize 函數,但是rand函數產生的並不是真意正義上的隨機數,是一個偽隨機數,是根據一個數,稱之為種子,為基準以某個遞推公式推算出來的一係數,當這系列數很大的時候,就符合正態公布,從而相當於產生了隨機數。
  • 單片機隨機數:rand(),srand()
    srand()就是給rand()提供種子seed如果srand每次輸入的數值是一樣的,那麼每次運行產生的隨機數也是一樣的,srand(n)for(10)rand()也就是說,以一個固定的數值作為種子是一個缺點。
  • 老司機教您單片機C語言如何產生隨機數
    KEIL裡面產生隨機數的函數確實是rand(),但頭文件是stdlib.h,不是time.h。C語言提供了一些庫函數來實現隨機數的產生。C語言中有三個通用的隨機數發生器,分別為 rand函數, random函數, randomize 函數;但是rand函數產生的並不是真意正義上的隨機數,是一個偽隨機數,是根據一個數,稱之為種子,為基準以某個遞推公式推算出來的一係數,當這系列數很大的時候,就符合正態公布,從而相當於產生了隨機數,但這不是真正的隨機數,當計算機正常開機後,這個種子的值是定了的,除非破壞了系統,為了改變這個種子的值
  • 【編程基礎】C語言產生隨機數需要了解的幾個函數
    C語言產生隨機數是一個常見的編程功能任務,當然這個也不難,調用兩三個函數就出來了,但是你知道這些函數具體是起到怎樣的作用,並且是它們是如何產生隨機數的嗎?幾個概念隨機數:數學上產生的都是偽隨機數,真正的隨機數使用物理方法產生的。隨機數種子:隨機數的產生是由算術規則產生的,srand(seed)的隨機數種子不同,rand()的隨機數值就不同,倘若每次的隨機數種子一樣,則rand()的值就一樣。
  • 隨機數大家都會用,但是你知道生成隨機數的算法嗎?
    再不濟我們每周的抽獎都是用隨機數抽出來的,我們用隨機數的時候,往往都會加一個前綴,說它是偽隨機數,那麼這個偽隨機數的偽字該怎麼解釋,什麼又是真隨機數呢?平方取中法我們首先介紹的是平方取中法,這個方法非常簡單粗暴,是用來產生四位隨機數的。具體的邏輯是怎樣的呢?首先我們需要一個隨機種子,比如2333,我們把這個隨機種子進行平方,得到5442889。
  • 什麼帳戶隨機數?隨機數的作用是什麼?
    (什麼帳戶隨機數?隨機數的作用是什麼?| 金色百科)  那麼隨機數在比特幣區塊鏈中的作用是什麼呢?  在比特幣區塊鏈中,所有參與節點都在遍歷尋找一個隨機數,節點算力輸出越大就越有可能遍歷到這個隨機數,也就能夠搶到這一輪的記帳權,這個過程通常被稱為「挖礦」。各參與節點在遍歷隨機數的過程中也在不斷地驗證其他節點的交易信息,搶到記帳權的節點會把所有相關的信息廣播出來,全網中所有參與節點在共同驗證了廣播出來的信息之後就會形成一個區塊,緊接在上一個區塊的後面,形成一條區塊數據鏈。
  • 隨機數生成
    如利用蒙特卡羅法估計測量數據的不確定時,就需要使用隨機數生成器來傳遞分布。本書中大量的例子都用到了示例數據,創建這些數據就利用了隨機數生成器。Igor具有強大的統計分析功能,提供了大量函數和命令,用於分布計算、參數估計、假設檢驗、回歸分析等。其中僅偽隨機數生成器就有12種,可以生成滿足常見分布要求的隨機數,如二項分布隨機數、均勻分布隨機數、高斯分布隨機數、洛倫茲分布隨機數等。
  • 區塊鏈中隨機數的實現
    當我們談論計算機系統中的隨機性時,我們真正指的是偽隨機性,即儘可能模擬出現實世界應有的隨機性,使之近乎於「真正的隨機性」。以密碼學安全偽隨機數生成器為例,這是一個非常強大的隨機性模擬。隨機數在隱私技術和密碼學中發揮著重要作用。令人驚豔的是,通過生成一個隨機數來對一條消息進行運算(XOR),提供了一種簡單但十分強大的加密方案。
  • lcg線性同餘隨機數生成器
    作者: 人生若只如初見計算機產生隨機數在概率算法設計中,隨機數分為真隨機數和偽隨機數,計算機只能產生偽隨機數。
  • 8位單片機隨機數
    8位單片機很多地方需要隨機數,比如遊戲的洗牌,可在timer中取數,但是隨機數質量不高。隨機數是一個既簡單又複雜的問題,這裡的例子使用了眾所周知的線性疊加法,沒本文引用地址:http://www.eepw.com.cn/article/201612/325265.htm有完美的方法產生隨機數,不過線性疊加法是一個合適的方法,徹底解決8位機隨機數的問題。
  • C++ 隨機數初探
    C++11種引入了新的隨機數接口,我們一起來看看吧。rand 函數有一些問題:即使不是大多數,也有很多程序需要不通範圍的隨機數。一些應用需要隨機浮點數。一些程序需要非均勻分布的隨機數。而在編寫程序為了解決這些通常會轉換 rand 生成的隨機數的範圍、類型或者是分布時,常常會引入非隨機性。
  • Excel生成隨機數的技巧,隨機數發生器,你用過嗎
    Excel獲取隨機數從概率分布中產生隨機樣本,其基本原理是隨機數的概念。隨機數是均勻分布在0和1之間的數。從技術上講,電腦不能產生真正的隨機數,因為它們必須使用一個可預測的算法。但是,設計用於產生一個數列的算法,似乎是隨機的。在 Excel中,我們可以使用函數RAND()在任何一個單元格之中產生隨機數。
  • 密碼學的骰子——隨機數
    做開發的工程師們應該或多或少都接觸過隨機數,可能認為它就是一個隨機生成的數字嘛,使用時也很簡單,只要調用開發語言提供的函數即可。但實際上隨機數後面還是有著比較複雜但也有趣的知識點的。根據一般定義,隨機數應該具有以下三個性質:隨機性,不存在統計學偏差,是完全雜亂的數列,即分布均勻性和獨立性;不可預測性,不能從過去的隨機數數列推測出下一個出現的數;不可重現性,不能重現相同的數列。
  • JavaScript用Math.random()生成隨機數
    基本概念顧名思義,Math.random()方法就是用於生成隨機數的,因為單詞random的意思正是「隨機的」。該方法生成的結果是 [0, 1) 範圍內的浮點數,注意這是一個左閉右開的區間,即該區間包含0而不包含1。官方文檔指出Math.random()方法生成的隨機數在該區間上要大致符合均勻分布。
  • excel隨機數函數是什麼?excel怎樣生成隨機數?
    本篇將介紹excel隨機數函數是什麼?excel怎樣生成隨機數?有興趣的朋友可以了解一下!一、前言excel是我們工作中很常用的一款表格製作工具,它不僅僅只是用來製作表格,它還能對表格中的數據進行處理(比如:運算、排序、篩選等)。
  • Excel隨機數生成方法,包括準確生成不重複和小數隨機數
    在 Excel 中,生成隨機數有兩個函數,分別為Rand函數和RandBetween函數,前者用於生成 0 到 1 之間的隨機數,後者用於生成指範圍的隨機數。它們生成的隨機數中都會產生重複值,如果要生成不重複的隨機數得用變通的方法,通常有兩種方法,一種為先生成種子再生成不重複的隨機數,另一種為用多個函數生成。
  • Java隨機數的幾種有趣用法
    眾所周知,隨機數是任何一種程式語言最基本的特徵之一。而生成隨機數的基本方式也是相同的:產生一個0到1之間的隨機數。