随機函數

随機函數

計算機術語
随機函數就是産生數的函數,是EXCEL中很重要的函數,C語言裡也有rand(),srand()等随機函數。标準C庫中函數rand()可以生成0~RAND_MAX之間的一個随機數,其中RAND_MAX是stdlib.h中定義的一個整數,它與系統有關。C語言中還有一個random()函數可以獲取随機數,但是random()不是标準函數,不能在VC/VS等編譯器通過,所以比較少用。
    中文名:随機函數 外文名: 所屬學科: 類型:産生數的函數 性質:EXCEL中很重要的函數 包括:C語言

生成數字

(1)生成随機數比較簡單,=rand()即可生成0-RAND_MAX之間的随機數;(#define RAND_MAX 0x7fffu)

(2)如果要是整數,就用=int(rand()%10),表示0至9的整數,以此類推;

(3)如果要生成a與b之間的随機實數,就用=rand()%(b-a)+a,就能産生固定位數的整數了,以此類推。

注意:如果要使用函數rand()生成一随機數,并且使之不随單元格計算而改變,可以在編輯欄中輸入“=rand()”,保持編輯狀态,然後按F9,将公式永久性地改為随機數。

不過,這樣隻能一個一個的永久性更改,如果數字比較多,也可以全部選擇之後,另外選擇一個合适的位置粘貼,粘貼的方法是點擊右鍵,選擇“選擇性粘貼”,然後選擇“數值”,即可将之前複制的随機數公式産生的數值(而不是公式)複制下來。

在實際編程中,我們經常需要生成随機數,例如,貪吃蛇遊戲中在随機的位置出現食物,撲克牌遊戲中随機發牌。

字母

随機小寫字母:=CHAR(INT(RAND()*26)+97)

随機大寫字母:=CHAR(INT(RAND()*26)+65)

随機大小寫混合字母:=CHAR(INT(RAND()*26)+if(INT(RAND()*2)=0,65,97))

有些情形下,我們需要生成一個不重複的随機序列。

比如:我們要模拟洗牌,将一副撲克牌去掉大小怪後剩下的52張打亂。

比較笨的方法是在1-52間每生成一個随機數後,檢查該随機數是否出現過,如果是第一次出現,就放到序列裡,否則重新生成一個随機數作檢查。在excel worksheet裡面用這種辦法,會造成if多層嵌套,不勝其煩,在VBA裡面做簡單一些,但是效率太差,越到序列的後端,效率越差。

當然也有比較好的辦法,在VBA裡面,将a(1)-a(52)分别賦予1-52,然後做52次循環,例如,第s次生成一個1-52間的随機數r,将a(s)與a(r)互換,這樣的話,就打亂了原有序列,得到一個不重複的随機序列。

VBA裡這個算法是很容易實現的,但是,出于通用性和安全考慮,有的時候我們并不希望用VBA,我們來看看在worksheet裡面如何利用内置函數實現這個功能。

(1)在A1-A52間填入"=INT(RAND()*52)+1",産生1-52間的随機數,注意這裡是有重複的。

(2)在B1-B52間填入1-52。

(3)在C54-BB54填入1-52。

(4)在C1填入"=IF(ROW()=C$54,INDEX(B$1:B$52,INDEX($A$1:$A$52,C$54)),IF(ROW()=INDEX($A$1:$A$52,C$54),INDEX(B$1:B$52,C$54),B1))"。

(5)将C1複制到C1:BA52這個區域裡面。

(6)在BA1:BA52中,我們就得到了一個不重複的随機序列,按F9可以生成一個新序列。

随機産生六位數字密碼=INT(RAND()*(899999-10001))+100001。

EXCEL生成前2位是大寫字母,中間4位是小寫字母,後兩位是數字。

=CHAR(65+INT(RAND()*16))&CHAR(65+INT(RAND()*16))&CHAR(97+INT(RAND()*16))&CHAR(97+INT(RAND()*16))&CHAR(97+INT(RAND()*16))&CHAR(97+INT(RAND()*16))&INT(RAND()*10)&INT(RAND()*10)。

在A1中輸入公式=rand()*100000,表示随機數乘以一個比較大的數,然後往下填充N個單元格。在B1中輸入排序公式=rank(A1,A:A),雙擊填充,或往下填充N個單元格,B1到BN就是你所需要的N個不同随機數了。

解釋

rand()函數沒有輸入參數,直接通過表達式rand()來引用;例如可以用下面的語句來打印兩個随機數:printf("Random numbers are:%i%in",rand(),rand())。

因為rand()函數是按指定的順序來産生整數,因此每次執行上面的語句都打印相同的兩個值,所以說C語言的随機并不是真正意義上的随機。

為了使程序在每次執行時都能生成一個新序列的随機值,我們通常通過為随機數生成器提供一粒新的随機種子。函數srand()(來自stdlib.h)可以為随機數生成器播散種子。隻要種子不同rand()函數就會産生不同的随機數序列。srand()稱為随機數生成器的初始化器。

例程

當提供的種子相同時,随機數序列也時相同的。而且當種子為1時,與不使用srand()函數時一樣的,也就是說rand()函數默認情況下初始化種子值為1。

在stdlib.h中這兩個函數的原型是:

int rand();

void srand(unsigned int);

srand(time(0));i=rand();這樣i就是一個真正意義上的随機數。

原因

rand()産生僞随機數,srand函數提供種子,種子不同産生的随機數序列也不同,所以通常先調用srand函數time(0)返回的是系統的時間(從1970.1.1午夜算起),單位:秒,種子不同當然産生的随機數相同幾率就很小了。

相關詞條

相關搜索

其它詞條