分享兩種產生隨機數的常用方法

2021-02-19 嵌入式情報局

ID:嵌入式情報局

作者:情報小哥

    隨機數的產生非常的有用,最直接的感受就是讓顯示的數據產生跳動,從而讓用戶感覺真實可靠,同樣在密碼學中隨機數也是非常重要等等,這裡今天小哥就介紹兩種產生隨機數的辦法。

「rand()」函數是系統庫文件提供的產生隨機數的函數,它從一個隨機數的序列中按著順序返回一個從0到最大隨機數 RAND_MAX的任意整數,當然最大隨機數的大小通常是固定的一個整數,所以每次程序運行從調用開始的序列都是一樣的 , 這樣也是為了便於程式設計師調試相應的程序。

下面來看一下rand函數的使用 : 

#include <iostream>
#include <string> 
#include <stdlib.h>
using namespace std;

int rand_number()
{
 return rand(); 

int main()
{
 int  array[4] = {1,2,3,4};
 for(int i = 0; i < 4;i++)
 {
  int t = rand_number()%4;
  cout << array[t]<<',';
 } 
}

得到如下運行結果 : 

同樣上面的程序我們再進行重新運行,得到的仍然是同樣的結果。所以為了解決每次重頭開始運行其隨機數一樣的問題,「rand()」 函 數 需 要 與 另 一 個 函 數「srand()」 配 合 使 用。「srand()」函數的功能是給定一個種子,種子的用途是產生一個確定的隨機數序列,如果種子不變,產生的隨機數序列也是固定的,種子變化,產生的隨機數序列隨之變化。那麼最簡單的即使採用時間作為種子,可是使用「time(NULL)」作為種子,於是time產生的種子每秒鐘變化一次,如果程序兩次運行的時間間隔超過 1s的事件,那麼使用rand函數產生的隨機數序列就會發生變化的。

#include <iostream>
#include <string> 
#include <ctime>
#include <stdlib.h>
using namespace std;

int rand_number()
{
 return rand(); 

int main()
{
 int  array[4] = {1,2,3,4};
 
 srand(time(NULL));
 
 for(int i = 0; i < 4;i++)
 {
  int t = rand_number()%4;
  cout << array[t]<<',';
 } 
}


而在計算機裡面其實基本上都只能算偽隨機數,有些嵌入式作業系統中,大多採用硬體的隨機白噪聲源來作為隨機數源,不過對於大部分應用這些偽隨機數基本上能夠滿足需求。由於我們的程序採集數據的隨機性,可以通過獲得更高頻率的計數值取餘以後得到偽隨機數。如果隨機數產生的時間間隔達到毫秒級,對於採集隨機數高於ms級別的均可以用此方法採集隨機數,同樣如果能夠獲得us計數那麼產生的隨機數就會更快。

#include <iostream>
#include <string> 
#include <ctime>
#include <stdlib.h>
#include <windows.h>
using namespace std;

int rand_number()
{
 SYSTEMTIME sys;
 GetLocalTime(&sys);
 return sys.wMilliseconds;

int main()
{
 int  array[10] = {1,2,3,4,5,6,7,8,9,0};
 
 srand(time(NULL));
 
 for(int i = 0; i < 10;i++)
 {
  int t = rand_number()%10;
  cout << array[t]<<',';
  long cnt  = 1000000;
  while(cnt--);
 } 
}

這裡生成了兩次隨機數如下:

這裡小哥就分享了一下C++中產生隨機數的兩種辦法,對於嵌入式C也可以類似的方法使用, 希望本文能夠對你有幫助!

相關焦點

  • 老司機教您單片機C語言如何產生隨機數
    隨機數在單片機的應用中也是很多的,當然產生隨機數的方法有很多,當中有一個就是利用單片機定時器,取出未知的定時器THX和TLX的值,再加以運算得到一個規定範圍內的隨機數值
  • numpy產生隨機數匯總
    random()產生的隨機數的分布非均勻分布,numpy.random.rand()產生的隨機數的分布為均勻分布。np.random.random((3,3))  ##產生一個[0,1)之間的形狀為(3, 3)的數組。
  • 隨機數本質,C語言的隨機數與隨機種子
    同時C語言也提供了一個標準庫裡面一個函數來產生隨機數,而對於隨機數的產生是根據種子(根據一個數值按照某種公式計算的)來變化的,種子 與隨機數之間符合正態分布(高斯分布)。}但是這個隨機數一旦編譯之後就固定了,並不能滿足我們的實際需求,前面提到了只是一個偽隨機數,我們需要對產生隨機數的種子進行不斷的重播,從而達到我們實際需求的隨機數效果。
  • C語言如何產生不重複的隨機數?
    要做到這種效果,我目前找到了兩種算法,一種叫洗牌算法,另一種我也不知道叫什麼名字。unsigned)time(NULL));for (int i = 0; i < 1000; i++){k = rand() % 5;n = rand() % 5;s = a[k];a[k] = a[n];a[n] = s;}這種算法就像洗牌一樣打亂順序,在這裡的for循環執行了1000次,就相當於洗牌了1000次,最後把數組a的值從a[0]到a[4]按順序依次輸出就形成了不重複的隨機數
  • 單片機C語言如何產生隨機數
    ,當然產生隨機數的方法有很多,當中有一個就是利用單片機定時器,取出未知的定時器THX和TLX的值,再加以運算得到一個規定範圍內的隨機數值。 KEIL裡面產生隨機數的函數確實是rand(),但頭文件是stdlib.h,不是time.h。C語言提供了一些庫函數來實現隨機數的產生。
  • 單片機C語言如何產生隨機數?
    隨機數在單片機的應用中也是很多的,當然產生隨機數的方法有很多,當中有一個就是利用單片機定時器,取出未知的定時器KEIL裡面產生隨機數的函數確實是rand(),但頭文件是stdlib.h,不是time.h。C語言提供了一些庫函數來實現隨機數的產生。
  • 隨機數大家都會用,但是你知道生成隨機數的算法嗎?
    真偽隨機數目前學界劃分真偽隨機數的方式非常簡單,一句話就能說明白,凡是用一定的算法使用程序生成的都是偽隨機數,通過物理現象產生的隨機數才是真隨機數。也就是說計算學家們已經證明了僅僅依靠算法是無法生成真隨機數的,也可以認為這是一個NP問題。算法生成的都是偽隨機數的證明太過複雜我們可以不去深究,但是什麼又叫做物理現象產生的隨機數呢?其實也很簡單,舉個很簡單的例子就是拋硬幣和擲骰子。當然物理現象不止這些,比如還有電子元件的噪音、元素的衰變等等。真假隨機數之間的最大差別在哪裡?其實就在是否可以預測上。
  • Excel產生隨機數Rand函數巧妙應用
    Excel中產生隨機數的函數有兩個,一個是rand函數,一個是randbetween函數,今天主要介紹rand函數的用法,從入門至精通。
  • 教您單片機C語言如何產生隨機數
    隨機數在單片機的應用中也是很多的,當然產生隨機數的方法有很多,當中有一個就是利用單片機定時器,取出未知的定時器THX和TLX的值
  • 【Python 第60課】 隨機數
    之前的小遊戲中用到過random中的randint:import randomnum = random.randint(1,100)random.randint(a, b)可以生成一個a到b間的隨機整數,包括a和b。a、b都必須是整數,且必須b≥a。
  • 偽隨機數發生器:你不知道,其實計算機並不能產生隨機數
    在生活中,我們需要用到隨機數的地方很多,例子也很好舉,比如我們買彩票的號碼就是一個隨機數。但是當計算機中需要產生隨機數的時候,絕大多數情況下並不是真的隨機數,我們把它稱為偽隨機數。這些偽隨機數是在一定的數值範圍內,採用一定的算法挑選出了一個數字,作為隨機產生的結果顯示出來,我們只能夠儘量讓這個算法公平一些,讓挑選到範圍內每一個數字的概率儘量做到一樣大,這樣產生的結果會更接近隨機數。
  • Excel隨機數生成方法,包括準確生成不重複和小數隨機數
    在 Excel 中,生成隨機數有兩個函數,分別為Rand函數和RandBetween函數,前者用於生成 0 到 1 之間的隨機數,後者用於生成指範圍的隨機數。它們生成的隨機數中都會產生重複值,如果要生成不重複的隨機數得用變通的方法,通常有兩種方法,一種為先生成種子再生成不重複的隨機數,另一種為用多個函數生成。
  • excel隨機數函數是什麼?excel怎樣生成隨機數?
    本篇將介紹excel隨機數函數是什麼?excel怎樣生成隨機數?有興趣的朋友可以了解一下!一、前言excel是我們工作中很常用的一款表格製作工具,它不僅僅只是用來製作表格,它還能對表格中的數據進行處理(比如:運算、排序、篩選等)。
  • C++ 隨機數初探
    rand 函數有一些問題:即使不是大多數,也有很多程序需要不通範圍的隨機數。一些應用需要隨機浮點數。一些程序需要非均勻分布的隨機數。而在編寫程序為了解決這些通常會轉換 rand 生成的隨機數的範圍、類型或者是分布時,常常會引入非隨機性。
  • java生成隨機數的五種方法
    Math.random() 靜態方法產生的隨機數是 0 - 1 之間的一個 double,即 0 <= random <= 1。initRNG() 方法是 synchronized 的,因此在多線程情況下,只有一個線程會負責創建偽隨機數生成器(使用當前時間作為種子),其他線程則利用該偽隨機數生成器產生隨機數。因此 Math.random() 方法是線程安全的。
  • C語言/C++中如何產生隨機數
    需要說明的是,iostream頭文件中就有srand函數的定義,不需要再額外引入stdlib.h;而使用time()函數需要引入ctime頭文件。使用rand()函數獲取一個隨機數如果你只要產生隨機數而不需要設定範圍的話,你只要用rand()就可以了:rand()會返回一隨機數值, 範圍在0至RAND_MAX 間。
  • 【編程基礎】C語言產生隨機數需要了解的幾個函數
    C語言產生隨機數是一個常見的編程功能任務,當然這個也不難,調用兩三個函數就出來了,但是你知道這些函數具體是起到怎樣的作用,並且是它們是如何產生隨機數的嗎?幾個概念隨機數:數學上產生的都是偽隨機數,真正的隨機數使用物理方法產生的。隨機數種子:隨機數的產生是由算術規則產生的,srand(seed)的隨機數種子不同,rand()的隨機數值就不同,倘若每次的隨機數種子一樣,則rand()的值就一樣。
  • 什麼帳戶隨機數?隨機數的作用是什麼?
    (什麼帳戶隨機數?隨機數的作用是什麼?| 金色百科)  那麼隨機數在比特幣區塊鏈中的作用是什麼呢?  隨機數很重要,對於比特幣這種密碼學電子貨幣來說,尤其重要,可以說:隨機數是以現代密碼學為基礎的信息安全系統的基石。在現代信息安全系統中,密碼體制和算法本身可以被公開,訪問策略可以公布,密碼設備可能丟失,而系統的安全性要求不受影響。整個系統的安全性完全依賴於隨機數序列的生成效率和質量。隨機數在基於計算機或Internet的通信和交易中有著廣泛的應用。
  • python中的隨機數
    random模塊是python中的隨機數模塊,也是比較常用的模塊之一。
  • 密碼學的骰子——隨機數
    我們在平時編程開發裡用到的隨機數,一般都只滿足第一個條件,這種只滿足隨機性分布的隨機數,就叫做偽隨機數或弱偽隨機數。這是因為程式語言提供的隨機數生成方法(學名叫偽隨機數生成器)是靠軟體算法實現的,既然是算法,那就必定遵循了一定的規律,也就有被預測的可能。