隨機函數 rand()

用法:

 1、生成隨機數字

  (1)生成隨機數比較簡單,=rand()即可生成0-1之間的隨機數;
  (2)如果要是整數,就用=int(rand()/10),表示0至9的整數,以此類推;
  (3)如果要生成a與b之間的隨機實數,就用=rand()*(b-a)+a,如果是要整數就用=int(rand()*(b-a))+a;稍微擴充一下,就能產生固定位數的整數了。
  注意:如果要使用函數rand()生成一隨機數,並且使之不隨單元格計算而改變,可以在編輯欄中輸入“=rand()”,保持編輯狀態,然後按F9,將公式永久性地改爲隨機數。不過,這樣只能一個一個的永久性更改,如果數字比較多,也可以全部選擇之後,另外選擇一個合適的位置粘貼,粘貼的方法是點擊右鍵,選擇“選擇性粘貼”,然後選擇“數值”,即可將之前複製的隨機數公式產生的數值(而不是公式)複製下來!
  2、產生隨機字母
  隨機小寫字母:=CHAR(INT(RAND()*26)+97)
  隨機大寫字母:=CHAR(INT(RAND()*26)+65)
  隨機大小寫混合字母:=CHAR(INT(RAND()*26)+if(INT(RAND()*2)=0,65,97))
  3、產生隨機的六位數的字母和數字混合
  =CONCATENATE(IF(INT(RAND()*2)=0,CHAR(INT(RAND()*9+48)),IF(INT(RAND()*2)=0,CHAR(INT(RAND()*25+65)),CHAR(INT(RAND()*25+97)))),IF(INT(RAND()*2)=0,CHAR(INT(RAND()*9+48)),IF(INT(RAND()*2)=0,CHAR(INT(RAND()*25+65)),CHAR(INT(RAND()*25+97)))),IF(INT(RAND()*2)=0,CHAR(INT(RAND()*9+48)),IF(INT(RAND()*2)=0,CHAR(INT(RAND()*25+65)),CHAR(INT(RAND()*25+97)))),IF(INT(RAND()*2)=0,CHAR(INT(RAND()*9+48)),IF(INT(RAND()*2)=0,CHAR(INT(RAND()*25+65)),CHAR(INT(RAND()*25+97)))),IF(INT(RAND()*2)=0,CHAR(INT(RAND()*9+48)),IF(INT(RAND()*2)=0,CHAR(INT(RAND()*25+65)),CHAR(INT(RAND()*25+97)))),IF(INT(RAND()*2)=0,CHAR(INT(RAND()*9+48)),IF(INT(RAND()*2)=0,CHAR(INT(RAND()*25+65)),CHAR(INT(RAND()*25+97)))))
  4、隨機不重複數字序列的生成方法
  有些情形下,我們需要生成一個不重複的隨機序列。
  比如:我們要模擬洗牌,將一副撲克牌去掉大小怪後剩下的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))"。
  分項解釋:
  a:ROW()=C$54,如果當前行等於當前交換所排的序號
  b:INDEX(B$1:B$52,INDEX($A$1:$A$52,C$54)),返回在B1到B52中選擇A1:A52中的第C54個值
  c:IF(ROW()=INDEX($A$1:$A$52,C$54),否則的話,如果當前行等於A1:A52中第C54個值,則:
  d:INDEX(B$1:B$52,C$54),返回B1:B52中的第C54個值
  e:若以上條件都不滿足,則返回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)

解釋:

 #include <stdlib.h>

  rand()
  srand()
  標準C庫中函數rand()可以生成0~RAND_MAX之間的一個隨機數,其中RAND_MAX 是stdlib.h 中定義的一個整數,它與系統有關。
  rand()函數沒有輸入參數,直接通過表達式rand()來引用;例如可以用下面的語句來打印兩個隨機數:
  printf("Random numbers are: %i %i\n",rand(),rand());
  因爲rand()函數是按指定的順序來產生整數,因此每次執行上面的語句都打印相同的兩個值,所以說C語言的隨機並不是真正意義上的隨機。
  爲了時程序在每次執行時都能生成一個新序列的隨機值,我們通常通過爲隨機數生成器提供一粒新的隨機種子。函數 srand()(來自stdlib.h)可以爲隨機數生成器播散種子。只要種子不同rand()函數就會產生不同的隨機數序列。srand()稱爲隨機數生成器的初始化器。

例程

  文件名: rand_srand.c
  /* This program generates and prints ten random integers between 1 and RAND_MAX*/
  #include <stdio.h>
  #include <stdlib.h>
  int main()
  {
  unsigned int seed; /*申明初始化器的種子,注意是usigned int 型的*/
  int k;
  printf("Enter a positive integer seed value: \n");
  scanf("%u",&seed);
  srand(seed);
  printf("Random Numbers are:\n");
  for(k = 1; k <= 10; k++)
  {
  printf("%i",rand());
  printf("\n");
  }
  return 0;
  }
  當提供的種子相同時,隨機數序列也時相同的。而且當種子爲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午夜算起),單位:秒,種子不同當然產生的隨機數相同機率就很小了。


http://baike.baidu.com/view/3048977.htm

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章