1. 程式人生 > >C random C ++rand函式應用

C random C ++rand函式應用

random函式不是ANSI C標準,不能在gcc,vc等編譯器下編譯通過。但在C語言中int random(num)可以這樣使用,它返回的是0至num-1的一個隨機數。

 可改用C++下的rand函式來實現。

rand()%n   範圍  0~n-1

rand()主要是實現 產生隨機數,其他我們在這裡可以無視他

顯然任意 一個數  rand()%n  範圍顯然是  0~n-1;

那麼 如何產生 n~m的數呢? 一樣的   我們只要對rand()進行一些 符號操作就行了;

n+rand()%(m-n+1);    這樣就可以了

這樣我們 就只有 種子 和 浮點數的沒有分析了,

下面來說rand()的用法 ,浮點數的放在最後面講 :一般在用這個之前 都要  初始化 一個種子 ,但是  你不寫的話,系統會給你 一個預設的種子,下面是我們自己輸入種子的程式碼;

int seed;

scanf ("%d",&seed);

srand(seed);

cout<<rand()<<endl;
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
    int arr[15];
    //srand(time(NULL));
    int seed;
    while(1){
    scanf("%d",&seed);
    srand(seed);
    for (int i=0; i<15; i++)
         printf ("%d\t",rand()%10);
    printf ("\n");  
    }
    return 0;
}

經過下圖的比較發現,每一個種子都是保持著這個狀態的隨機變數值,會存在系統裡面;

因此,我們要對這個初始化種子  保持著  時刻不同;也就是說 我們還是用 srand(time(NULL));比較好

用如下程式碼比較合適:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
    //int arr[15];
    srand(time(NULL));
	 for (int i=0; i<15; i++)
         printf ("%d\t",rand()%10);
    printf ("\n");  
    while (1);
    return 0;
}


好了,我們現在講下最後一點---------浮點數的隨機產生

rand()%n   =========== 0~n-1     那麼  我們再除以 n  就行了

可以表示為:   (rand()%n)/(n*1.0)      //這裡注意下 隱式轉換   低------>高

下面給出一個範例:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
    int arr[15];
    //srand(time(NULL));
    int seed;
    while(1){
    scanf("%d",&seed);
    srand(seed);
    for (int i=0; i<15; i++)
         printf ("%lf\t",(rand()%10)/10.0);
    printf ("\n");  
    }
    return 0;
}


如果要  更精確呢?像0.11  這樣的呢???   道理是一樣的  

 我們可以輸出   (rand()%n)/(n*1.0)+(rand()%n)/(n*10.0);

由此我們可以總結出規律:p 表示精確位數

                                                                  {  p }

                                                                  1.......1*(rand()%n)/10^p