當前位置:首頁 » 編程語言 » c語言產生隨機整數

c語言產生隨機整數

發布時間: 2023-01-21 04:54:45

⑴ 如何在c語言中產生一定范圍的隨機數

c語言的獲取隨機數的函數為rand(),
可以獲得一個非負整數的隨機數。要調用rand需要引用頭文件stdlib.h。
要讓隨機數限定在一個范圍,可以採用模除加加法的方式。
要產生隨機數r,
其范圍為
m<=r<=n,可以使用如下公式:
rand()%(n-m+1)+m
其原理為,對於任意數,
0<=rand()%(n-m+1)<=n-m
於是
0+m<=rand()%(n-m+1)+m<=n-m+m

m<=rand()%(n-m+1)+m<=n

⑵ C語言中獲得隨機數的方法

問題1: 怎樣獲得一個真正的隨機數?要知道,rand()是不能產生真正的隨機數的!即使不能產生真正的隨機數,也要大概接近呀!而rand()好象每次的隨機都一樣。

專家解答:

之所以rand()每次的隨機數都一樣是因為rand()函數使用不正確。各種編程語言返回的隨機數(確切地說是偽隨機數)實際上都是根據遞推公式計算的一組數值,當序列足夠長,這組數值近似滿足均勻分布。如果計算偽隨機序列的初始數值(稱為種子)相同,則計算出來的偽隨機序列就是完全相同的。這個特性被有的軟體利用於加密和解密。加密時,可以用某個種子數生成一個偽隨機序列並對數據進行處理;解密時,再利用種子數生成一個偽隨機序列並對加密數據進行還原。這樣,對於不知道種子數的人要想解密就需要多費些事了。當然,這種完全相同的序列對於你來說是非常糟糕的。要解決這個問題,需要在每次產生隨機序列前,先指定不同的種子,這樣計算出來的隨機序列就不會完全相同了。你可以在調用rand()函數之前調用srand( (unsigned)time( NULL ) ),這樣以time函數值(即當前時間)作為種子數,因為兩次調用rand函數的時間通常是不同的,這樣就可以保證隨機性了。你也可以使用srand函數來人為指定種子數。Windows 9x/NT的游戲FreeCell就允許用戶指定種子數,這樣用戶如果一次游戲沒有成功,下次還可以以同樣的發牌結果再玩一次。

問題2: 我按照上述方法並不能產生隨機數,僅產生公差為3或4的等差數列:
#include <stdlib.h>
#include <iostream.h>
#include <conio.h>
#include <time.h>
void main()
{
for(int i=0;i<100000;i++)
{
srand( (unsigned)time( NULL ) );
cout<<rand()<<endl;
}
}
專家解答:
你的程序是有問題的,你每產生一個隨機數之前,都調用一次srand,而由於計算機運行很快,所以你每次用time得到的時間都是一樣的(time的時間精度較低,只有55ms)。這樣相當於使用同一個種子產生隨機序列,所以產生的隨機數總是相同的。你應該把srand放在循環外:
srand( (unsigned)time( NULL ) );
for(int i=0;i<100000;i++)
{
//相關語句
}

⑶ C語言如何編程產生隨機數

1、首先打開Visual stdio 2019,依次點擊文件,新建,項目新建以一個空白的項目:

⑷ 怎麼用C語言生成隨機數

假設要生成的隨機數是大於等於20且小於等於100的整數

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
voidmain(){inta,b,x;
a=20;b=100;
srand((unsignedint)time(NULL));//用當前時間生成一個隨機數種子
x=rand()%(b-a+1)+a;
printf("得到一個隨機數:%d ",x);
}

⑸ C語言編程中生成隨機數的初級教程

幾個概念

隨機數:數學上產生的都是偽隨機數,真正的隨機數使用物理方法產生的。

隨機數種子:隨機數的產生是由算術規則產生的,srand(seed)的隨機數種子不同,rand()的隨機數值就不同,倘若每次的隨機數種子一樣,則rand()的值就一樣。所以要產生隨機數,則srand(seed)的隨機數種子必須也要隨機的。

用srand()產生隨機數種子

原型:void srand ( unsigned int seed );

作用是設置好隨機數種子,為了讓隨機數種子是隨機的,通常用time(NULL)的值來當seed。

time()用於隨機數種子

函數原型:time_t time ( time_t * timer );

time()函數表示返回1970-1-1 00:00:00 到當前時間的秒數。

用的時候這樣:srand(unsigned(time(NULL)));例如產生1~10之間的隨機整數

#include#includeint main(){ srand(time(NULL)); for(int i=0;i < 10;i++) { int randValue=rand()%10; }}

上面的程序中要注意srand是在for循環外面的,如果把srand放到for循環裡面,則每次產生的隨機數都相同。

用rand()產生隨機數

原型:int rand ( void );

作用是產生一個隨機數,當然隨機數是有范圍的,為0~RAND_MAX之間,隨機數與隨機數種子有關。具體來說是,在產生隨機數 rand()被調用的時候,它會這樣執行:

如果用戶之前調用過 srand(seed)的話,他會重新調用一遍 srand(seed)以產生隨機數種子;

如果發現沒有調用過 srand(seed)的話,會自動調用 srand(1)一次。

如果調用srand(seed)產生的隨機數種子是一樣的.話(即seed的值相同),rand()產生的隨機數也相同。

所以,如果希望rand()每次調用產生的值都不一樣,就需要每次調用srand(seed)一次,而且seed不能相同。這里就是經常採用time(NULL)產生隨機數種子的原因。

C語言中可以使用rand()函數來生成一個從0到RAND_MAX的uniform分布。基於這個函數,我們可以構造出一些特定的隨機數生成器來滿足我們的需求。

(一)0到1的uniform分布:

//generate a random number in the range of [0,1]double uniform_zero_to_one(){ return (double)rand()/RAND_MAX;}

(二)任意實數區間的uniform分布:

//generate a random real number in [start,end]double uniform_real(double start,double end){ double rate=(double)rand()/RAND_MAX; return start+(end-start)*rate;}

(三)任意整數區間的uniform分布:

//generate a random integer number in [start,end)int uniform_integer(int start,int end){ int base=rand(); if(base==RAND_MAX) return uniform_integer(start,end); int range=end-start; int remainder=RAND_MAX%range; int bucket=RAND_MAX/range; if(base<RAND_MAX-remainder) return start+base/bucket; else return uniform_integer(start,end);}

這個函數要特別說明一下,平常時候我們都是用rand()%n來生成0到n-1的隨機數,但是按這種方法生成的分布並不是uniform的,另外由於RAND_MAX只有32767,因此要生成比這個數更大的隨機數需要另外想辦法,理論上可以直接用0到1的uniform分布直接放縮,但實際效果不好。這里給出一種移位方式的實現。

(四)32bits的隨機數

//generate a random 32 bits integer number int rand32(){ return ((rand()<<16)+(rand()<<1)+rand()%2);}

有了32bits的隨機數生成方法,就可以構造32bits范圍內的隨機整數區間了,方法和之前16bits的情況一樣。

(五)32bits范圍內的隨機整數區間

//generate a random 32bits integer number in [start,end) int uniform_integer_32(int start,int end){ int base=rand32(); if(base==RAND32_MAX) return uniform_integer_32(start,end); int range=end-start; int remainder=RAND32_MAX%range; int bucket=RAND32_MAX/range; if(base<RAND32_MAX-remainder) return start+base/bucket; else return uniform_integer_32(start,end);}

這里RAND32_MAX定義為0x7fffffff。

除此之外,利用rand()函數構造任意分布的隨機數也是個值得探討的問題。

理論上可以通過(0,1)的uniform分布,加上標准采樣方法(sampling)獲得。

⑹ c語言產生隨機數的函數

在c語言中要產生隨機數可以用rand函數。

默認情況下這個函數產生的隨機整數的范圍是[0,RAND_MAX]。

RAND_MAX是一個預定義的宏,其值等於平台上int類型的最大值。

可以使用如下公式來產生一個[min,max]之間的隨機整數:

rand()%(max-min+1)+min

下面這個例子可以產生10個[1,100]的隨機數,並輸出了它們:

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

int main()

{

int i;

//初始化隨機數種子

srand(time(NULL));

//printf("%d ",RAND_MAX);

for(i=0;i<10;i++)

printf("%d ",rand()%100+1);

return 0;

}

下面是運行結果的截圖:

⑺ c語言中如何生成1個0到1的隨機數

C語言中生成1個0到1的隨機數可以執行語句:float b=rand()/(RAND_MAX+1.0);

解析:

標准C庫中函數rand()可以生成0~RAND_MAX之間的一個隨機數,其中RAND_MAX 是stdlib.h 中定義的一個整數,它與系統有關。rand()函數沒有輸入參數,直接通過表達式rand()來引用;

用函數rand取得的隨機數除以(RAND_MAX+1.0),即可確保得到的結果在0到1之間。ISO IEC 9899 2011 (C11)標准中未規定 RAND_MAX 的具體數值。但該標准規定了RAND_MAX 的值應至少為32767。編程的時候,不應該對 RAND_MAX 的具體數值做任何假設。

(7)c語言產生隨機整數擴展閱讀:

相關說明:

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

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

3、隨機種子(Random Seed)是計算機專業術語,一種以隨機數作為對象的以真隨機數(種子)為初始條件的隨機數。一般計算機的隨機數都是偽隨機數,以一個真隨機數(種子)作為初始條件,然後用一定的演算法不停迭代產生隨機數。

⑻ 如何在C語言中生成一定范圍內的隨機數

用rand函數吧,好久不用C語言,不太記得,貌似是int a=rand()% X(X即范圍)這是偽隨機數
#include<time.h>
srand(time(NULL));使用前用這條語句初始化
使用int a=rand() / RAND_MAX * n;

就得到真正的隨機數

⑼ C語言怎麼弄隨機整數

#include <stdio.h>
#include <time.h> //提供time()函數的原型
#include <stdlib.h> //提供rand(),srand()函數的原型
int main()
{
int a;
srand(time(0)); //隨機數產生初始化
a= rand()%1000;//產生1--1000之間的隨機數
printf("%d\n",n);
return 0;
}

熱點內容
shell解壓zip 發布:2025-07-18 20:20:36 瀏覽:857
安卓泰拉瑞亞去哪裡買 發布:2025-07-18 20:01:05 瀏覽:694
flash編譯器 發布:2025-07-18 19:49:38 瀏覽:487
memcached源碼分析 發布:2025-07-18 19:22:42 瀏覽:866
android展示圖片 發布:2025-07-18 19:21:24 瀏覽:594
一台伺服器5個IP怎麼分配 發布:2025-07-18 19:12:34 瀏覽:862
貴陽分布式存儲行情 發布:2025-07-18 19:12:31 瀏覽:361
車場伺服器和工控機是如何連接的 發布:2025-07-18 19:10:19 瀏覽:938
計算機編程學什麼好 發布:2025-07-18 19:06:49 瀏覽:410
網吧用的伺服器是什麼伺服器 發布:2025-07-18 18:40:15 瀏覽:938