導航:首頁 > 源碼編譯 > 快速生成隨機數演算法

快速生成隨機數演算法

發布時間:2022-08-02 10:46:34

1. 如何產生正態分布的隨機數

這個要看你的具體需求,有幾種方法可以推薦。


首先最簡單:rejection sampling,思維方式非常簡單,容易實現,但效率很差更復雜:逆提供,直接使用累積分布函數的逆函數(CDF)生成隨機數,但涉及更復雜的計算誤差函數的小塊土地(非初等函數)更好:盒子-穆勒演算法,生成在很長一段時間的正態分布隨機數的「標准」演算法。


所以不管是那種演算法,都需要你去花些功夫來了解一下,是不是適合自己,是不是適合去解決現在自己正在面臨的問題,畢竟別的經驗都只是一些參考。在自己的實踐中逐步去發現自己的問題,找到最適合自己的很重要

2. 怎樣在C#中產生隨機數

.net.Frameword中提供了一個專門產生隨機數的類System.Random,此類默認情況下已被導入,編程過程中可以直接使用。我們知道,計算機並不能產生完全隨機的數字,它生成的數字被稱為偽隨機數,它是以相同的概率從一組有限的數字中選取的,所選的數字並不具有完全的隨機性,但就實用而言,其隨機程度已經足夠了。
可以用以下兩種方法初始化一個隨機數發生器;
函數是這樣用,比如100至999的隨機數
Random ran=new Random();
int RandKey=ran.Next(100,999);

不過這樣會有重復,可以給Random一個系統時間做為參數,以此產生隨機數,就不會重復了
第一種方法不指定隨機種子,系統自動選取當前時前作隨機種子:
Random ra=new Random();

第二種方法是指定一個int型的參數作為隨機種子:
int iSeed=6;
Random ra=new Random(iSeed);
下面我們要用到Random.Next()方法產生隨機數。
ra.Next();

它返回一個大於或等於零而小於2,147,483,647的數,這並不滿足我們的需要,下面我們介紹它的重載函數和其它一些方法。
public virtual int Next(int);

用法:ra.next(20)
返回一個小於所指定最大值(此處為20)的正隨機數。
public virtual int Next(int minValue, int maxValue);

用法:ra.next(1,20)
返回一個指定范圍內(此處為1-20之間)的隨機數,我們在下面的實例中會用到此函數。
類System.Random還有幾個方法分別是:
公共方法:
NextBytes用隨機數填充指定位元組數組的元素。
NextDouble返回一個介於 0.0 和 1.0 之間的隨機數。
受保護的方法:
Sample返回一個介於 0.0 和 1.0 之間的隨機數,只允許子類對象訪問。
以上介紹了隨機數的基本用法,下面我們用一個實例來做更進一步的介紹。要在一段數字區間內隨機生成若干個互不相同的隨機數,比如在從1到20間隨機生成6個互不相同的整數。
主要是下面兩個函數getRandomNum與getNum:

public int[] getRandomNum(int num,int minValue,int maxValue)
{
Random ra=new Random(unchecked((int)DateTime.Now.Ticks));
int[] arrNum=new int[num];
int tmp=0;
for (int i=0;i<=num-1;i ){
tmp=ra.Next(minValue,maxValue); //隨機取數
arrNum[i]=getNum(arrNum,tmp,minValue,maxValue,ra); //取出值賦到數組中
}
return arrNum;
}

getRandomNum即是在區間[minValue,maxValue]取出num個互不相同的隨機數,返回的數組包含著結果。
其中隨機數是這樣創建的 Random ra=new Random(unchecked((int)DateTime.Now.Ticks));為什麼不用Random ra=new Random();(系統自動選取當前時前作隨機種子)

用系統時間做隨機種子並不保險,如果應用程序在一個較快的計算機上運行,則該計算機的系統時鍾可能沒有時間在此構造函數的調用之間進行更改,Random 的不同實例的種子值可能相同。這種情況下,我們就需要另外的演算法來保證產生的數字的隨機性。所以為了保證產生的隨機數足夠"隨機",我們不得不使用復雜一點的方法來獲得隨機種子。在上面的這段程序中,我們首先使用系統時間作為隨機種子,然後將上一次產生的隨機數跟循環變數和一個與系統時間有關的整型參數相乘,以之作為隨機種子,從而得到了每次都不同的隨機種子,保證了產生足夠"隨機"的隨機數。

函數getNum是一遞歸,用它來檢測生成的隨機數是否有重復,如果取出來的數字和已取得的數字有重復就重新隨機獲取。值得注意的是要用一同一個隨機數實例生成,所以ra要作為參數傳入getNum中,否則生成的數字會有重復。

public int getNum(int[] arrNum,int tmp,int minValue,int maxValue,Random ra){
int n=0;
while (n<=arrNum.Length-1)
{
if (arrNum[n]==tmp) //利用循環判斷是否有重復
{
tmp=ra.Next(minValue,maxValue); //重新隨機獲取。
getNum(arrNum,tmp,minValue,maxValue,ra);//遞歸:如果取出來的數字和已取得的數字有重復就重新隨機獲取。
}
n ;
}
return tmp;
}

最後就是要顯示出來,當點擊一個button時取出的數字顯示在一個label中。

private void button1_Click(object sender, System.EventArgs e)
{
int[] arr=getRandomNum(6,1,20); //從1至20中取出6個互不相同的隨機數
int i=0;
string temp="";
while (i<=arr.Length-1){
temp =arr[i].ToString() " ";
i ;
}
label1.Text=temp; //顯示在label1中
}

3. C語言怎樣產生一定范圍的隨機數

編譯環境為:vs2013
產生1到3的整型隨機數的代碼如下:
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define max 3 //這個函數的意義為:隨機生成最大的數為3
#define min 1 //這個函數的意義為:隨機生成最小的數為1
int main()
{
int num;
srand(time(0));
num = rand() % (max - min) + min; // 這里的意義,「%」為模運算
printf("隨機數為:%d ", num);
system("pause"); //這個代碼可以讓彈出的黑框不會一下就消失
return 0;
}

(3)快速生成隨機數演算法擴展閱讀:

根據密碼學原理,隨機數的隨機性檢驗可以分為三個標准:

條件一、統計學偽隨機性。統計學偽隨機性指的是在給定的隨機比特流樣本中,1的數量大致等於0的數量,同理,「10」「01」「00」「11」四者數量大致相等。類似的標准被稱為統計學隨機性。滿足這類要求的數字在人類「一眼看上去」是隨機的。

條件二、密碼學安全偽隨機性。其定義為,給定隨機樣本的一部分和隨機演算法,不能有效的演算出隨機樣本的剩餘部分。

條件三、真隨機性。其定義為隨機樣本不可重現。實際上只要給定邊界條件,真隨機數並不存在,可是如果產生一個真隨機數樣本的邊界條件十分復雜且難以捕捉(比如計算機當地的本底輻射波動值),可以認為用這個方法演算出來了真隨機數。

隨機數分為三類:

①偽隨機數:滿足第一個條件的隨機數。

②密碼學安全的偽隨機數:同時滿足前兩個條件的隨機數。可以通過密碼學安全偽隨機數生成器

計算得出。

③真隨機數:同時滿足三個條件的隨機數。



4. 誰知道資料庫中怎樣產生隨機數

公式:(上限-下限+1)* rand() -下限

介紹:John von Neumann說:Any one who considers arithmetical methods of procing random digits is , of course, in a state of sin.

所以,在討論演算法實現隨機數的時候,總是說「偽隨機數」。

現在,應用最廣的隨機數生成演算法是由Derrick Henry Lehmer1951年給出的線性同餘法:

Xn+1 = ( aXn + c ) mod m, n>=0.

在上一篇偽隨機數的論述中,並沒有給出X0, a, c, m的取值規則,只是給出了ANSI C和Microsoft Visual C++的實現。

在這兒我們可以自己先思考一下,我們期望從上式中得到的隨機數應該滿足:

1) 上式的輸出足夠隨機,這是最基本的要求;

2) 上式給出盡量多的輸出,越接近m個越好(不可能超過m),即周期盡量長,最好為m,這樣才能保證上式滿足均勻分布(m個數在周期m中各出現一次);

3) 上式的生成速度足夠快。

最容易想到的,m的取值為計算機字大小(如2^32或2^64)。

但是這兒有個很嚴重的問題:Xn低位的隨機性很弱。原因如下:

令d|m, 且

Yn = Xn mod d



Yn+1 = ( ( aXn + c ) mod m ) mod d

= ( aYn + c ) mod d

上述表達式的意義即:Yn為Xn低k位(d=2^k),這樣的Yn序列形成周期為d甚至更短的同餘序列。舉例說明:d為2^1時,Yn為Xn的最低位(可假定為1或0),若Yn+1 != Yn,則Yn+2 == Yn必定成立,僅當a、c皆為奇數時Yn、Yn+1將0、1交替,否則,為常數(0或1)。

暫時拋開隨機性不管,先找到周期為m的隨機序列中的取值規則。

Donald Knuth在The Art of Computer Programming, Volume 2: Seminumerical Algorithms中的3.2.1.2節對m, a, c和X0取值規則的表述:

1) gcd(c, m) = 1. 即c, m互素,再白一點,c, m除1之外沒有其他公因子;

2) 任給質數p, p|m ==> p|(a-1). 即m%p==0,則(a-1)%p==0。

3) 4|m ==> 4|(a-1). 即m%4==0,則(a-1)%4==0。

這個證明過程對於我這樣的數論基礎不是很扎實的搞應用技術的人來說有點難以理解了。有興趣的話,還是去看3.2.1.2的證明吧:-)。

上面的規則告訴我們,滿足了上述規則後,可以保證序列周期為m。對於前面提到的關於隨機性的問題,既然Xn低位的隨機性比較弱,可以只取Xn的高位作為輸出。高位的隨機性和統計意義由a, c確定,其取值涉及統計檢驗,具體的也還是看3.3吧。

這篇文章解決了具有統計意義的隨機數的部分理論問題。

PS: 之前曾經BS過Windows Live Writer,當時覺得Writer編輯功能太少,不能直接設定鏈接文字的字體顏色,知道CSS可以設定之後,又覺得Word 2007編輯的Blog轉成html之後太大,而且也知道Word 2007上面是可以設置鏈接的target為_blank的。現在發現Writer還是很不錯的了,原來是可以設定格式的,也可以直接編輯html,而且可以Web預覽,鏈接還可以加入到鏈接詞彙表,挺方便的。

5. 如何產生10萬個隨機數!快速排序!求教!!!

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 50

int cmp1(const void *x,const void *y)
{
return *(int *)x-*(int *) y;
}
int cmp2(const void *x,const void *y)
{
return *(int *)y-*(int *)x;
}
int main()
{
int i,a[N];
srand(time(0));
for(i = 0;i<N;i++)
a[i] = rand();
qsort(a,N,sizeof(int),cmp1);
printf("升序序列:");
for(i = 0;i<N;i++) printf("%d ",a[i]);
printf("\n");
qsort(a,N,sizeof(int),cmp2);
printf("降序序列:");
for(i = 0;i<N;i++) printf("%d ",a[i]);
printf("\n");
return 0;
}

6. C#如何生成隨機不重復的數字

private string RndomStr(int codeLength)
{
//組成字元串的字元集合 0-9數字、大小寫字母
string chars = "0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,P,P,Q,R,S,T,U,V,W,X,Y,Z";
string[] charArray = chars.Split(new Char[] { ',' });
string code = "";
int temp = -1;//記錄上次隨機數值,盡量避避免生產幾個一樣的隨機數
Random rand = new Random();
//採用一個簡單的演算法以保證生成隨機數的不同
for (int i = 1; i < codeLength + 1; i++)
{
if (temp != -1)
{
rand = new Random(i * temp * unchecked((int)DateTime.Now.Ticks));//初始化隨機類
}
int t = rand.Next(61);
if (temp == t)
{
return RndomStr(codeLength);//如果獲取的隨機數重復,則遞歸調用
}
temp = t;//把本次產生的隨機數記錄起來
code += charArray[t];//隨機數的位數加一
}
return code;
}
//生成隨機數字方法
public class RandomHelper
{
/// <summary>
///生成制定位數的隨機碼(數字)
/// </summary>
/// <param name="length"></param>
/// <returns></returns>
public static string GenerateRandomCode(int length)
{
var result = new StringBuilder();
for (var i = 0; i < length; i++)
{
var r = new Random(Guid.NewGuid().GetHashCode());
result.Append(r.Next(0, 10));
}
return result.ToString();
}
}

7. 電腦隨機數產生的計算具體方法

實現的方法和詳細的操作步驟如下:

1、第一步,為main函數指定一個函數,如下圖所示,然後進入下一步。

8. 計算器如何產生隨機數

一般計算機的隨機數都是偽隨機數,以一個真隨機數(種子)作為初始條件,然後用一定的演算法不停迭代產生隨機數,下面介紹兩種方法:
一般種子可以以當前的系統時間,這是完全隨機的

演算法1:平方取中法。
1)將種子設為X0,並mod 10000得到4位數
2)將它平方得到一個8位數(不足8位時前面補0)
3)取中間的4位數可得到下一個4位隨機數X1
4)重復1-3步,即可產生多個隨機數
這個演算法的一個主要缺點是最終它會退化成0,不能繼續產生隨機數。

演算法2:線性同餘法
1)將種子設為X0,
2)用一個演算法X(n+1)=(a*X(n)+b) mod c產生X(n+1)
一般將c取得很大,可產生0到c-1之間的偽隨機數
該演算法的一個缺點是會出現循環。

9. 求各種產生隨機數的演算法

多的很呀!別撤消呀,千萬! 不過幾乎都是偽隨機數。 隨機序列的演算法 找到了兩個演算法, 第一個很簡單, 但可惜不是隨機的, 第二個是典型的偽隨機數演算法, 可惜要用到2的幾百萬次方這樣巨大的整數, 真痛苦 要是有UNIX上計算密碼的源代碼就好了 第一種做法: f(k) = (k*F(N-1)) mod F(N)其中, k是一個序列號, 就是要取的那個數的順序號 F(N)是這樣一個序列 F(0) = 0, F(1) = 1, F(N+2) = F(N+1)+F(N) (for N>=0)第二種做法V = ( ( V * 2 ) + B .xor. B ... )(Mod 2^n)N+1 N 0 2V是要取的隨機數, B是個種子, n是隨機數的最大個數 原來這個問題, 很高難, 不少數學高手都為解決這個問題寫了論文, 咳咳, 偶真是個白痴 呵呵, 效果肯定是不錯啦, 因為用不到很大的表. 至於應用是這樣的, 比如, 你要給每個用戶在注冊的時候一個ID但有不希望用戶在看到自己的ID的時候能知道其他用戶的ID, 如果用SEQUENCE來生成ID的話, 一個用戶只要把自己的ID減1就能得到其它用戶的ID了. 所以要用隨機數來做ID, 這樣用戶很難猜到其他用戶的ID了. 當然主要的問題是, 隨機數可能重復. 因此希望使用一個隨機數做種子用它來確定一組"無規律"的自然數序列, 並且在這個序列中不會出現重復的自然數. 在這里使用的方法生成的序列並不是沒有規律的, 只不過這個軌律很難被發現就是了. Xn+1 = (aXn + b) mod c (其中, abc通常是質數)是一種被廣泛使用的最簡單的隨機數發生演算法, 有研究表表明這個演算法生成的隨機數基本上符合統計規律, JAVA, BORLAND C等用的都是這個方法, 一般只要保證第一個種子是真正的隨機數就行了, 下面來說一下重復的問題, 上述方法會有可能出現重復, 因為當(aXn + b)有可能是同樣的數或者說余數相同的數, 因此要想不重復就得變形 偶想到的方法是 Xn=(a*n + b) mod c n是一個在1到c之間的整數, a*n + b就是一個線性公式了, 且若n不同則a*n + b也不同, 它們除上質數c得到的余數也肯定不同, 因為 若不考慮a和b而只有n的時候, 每次的結果都是n,而線性公式, 只不過移動了這條直線的位置和斜率而已, 每個結果仍然不會相同的, 為了增加不可預計性, 偶又為上面那個公式設計了, 隨機數種子, 於是就變成了這個樣子 F(N)=(隨機數*(N+隨機數))MOD 一個質數 這樣就能夠產生 1到選定質數之間的一個"無規律"的自然數序列了, 只要改變隨機數就能改變序列的次序 在應用的時候, 要把隨機數種子和最後用到的序列號保存到一個表裡, 每此使用的時候取出來算好, 再把序列號更新一下就可以了 具體地說, 就是可以建一個表來保存每個序列的隨機數種子, 然後再為這個序列建一個SEQUENCE就行瞭然後就SELECT MOD(序列控製表.隨機數*(SEQ.NEXTVAL+序列控製表.隨機數)),序列控製表.質數) FROM 序列控製表 WHERE 序列控製表.序列ID=XX就OK了注意 序列控製表.質數 決定了序列的范圍

10. 易語言那種演算法取隨機數最快

你好,這個問題吧 其實使用易語言自帶的 取隨機數()就可以了,速度相當的快,這樣的一個隨機功能,沒有必要去比較哪一種速度最快吧。。
還有一種是通過匯編的方式獲取隨機數,但我覺得還是取隨機數() 這個最實用,直接調用!

希望我的回答對你有所幫助!Kiss灬小豬

閱讀全文

與快速生成隨機數演算法相關的資料

熱點內容
程序員呼蘭搞笑 瀏覽:347
蘋果怎麼關閉自動排序app 瀏覽:957
國外可以訪問到用什麼伺服器地址 瀏覽:944
揚州前端程序員私活價格 瀏覽:987
視覺演算法程序員該買什麼筆記本 瀏覽:713
鍵盤滑鼠編程 瀏覽:841
linux中修改命令 瀏覽:286
dns伺服器地址怎麼查詢地址 瀏覽:863
php易寶支付介面 瀏覽:610
開源免費oaphp 瀏覽:884
數據加密過程簡述 瀏覽:811
python基礎教程pdf下載 瀏覽:125
如何統計伺服器 瀏覽:746
蘋果和安卓怎麼贈送模組 瀏覽:807
伺服器倒計時怎麼弄 瀏覽:34
excel文件夾更新 瀏覽:437
億點連接app哪裡好 瀏覽:791
java掃碼支付 瀏覽:877
單片機行車記錄儀 瀏覽:393
oppo雲伺服器什麼意思 瀏覽:84