C語言和java中生成隨機數的原理和方法
C語言
一.函式
1:int rand(void)
該函式會產生一個[0,RAND_MAX]的偽隨機數,那什麼是偽隨機數?
相當於一個序列a1-an,第一次使用會返回a1, 第二次使用會返回a2….第n次返回an,這樣每次呼叫rand()都能產生一個不同的數,只要整個序列的規律不明顯,整個函式看起來就是隨機的。
而這個序列是計算機通過呼叫srand((int)time(NULL))函式隨機產生的。
2:void srand(unsigned seed)
srand((unsigned)time(NULL))則使用系統定時/計數器的值作為隨機種子。每個種子對應一組根據演算法預先生成的隨機數序列,所以,在相同的平臺環境下,不同時間產生的隨機數會是不同的。如果該函式的引數是一個常數,那麼每次生成的隨機數序列都是固定的。
二.函式使用
1.標準使用:
# include <stdio.h>
# include <stdlib.h>
# include <time.h>
int main(void)
{
srand((int)time(NULL));
printf("%d\n",RAND_MAX);
for(int i = 0; i<5; i++)
{
printf("%d\n",rand());
}
return 0;
}
結果:
2:如果你想產生在[0, 32767]範圍內的一個範圍的隨機數,可以這樣:
# include <stdio.h>
# include <stdlib.h>
# include <time.h>
int main(void)
{
int n;
srand((int)time(NULL));
printf("你想生成隨機數的最大值是多少?\n");
scanf("%d",&n);
for(int i = 0; i<5; i++)
{
printf("%d\n",rand()%n);
}
return 0;
}
結果:
3.如果你還不滿足n的範圍,可以這樣(缺點:n太大精度不好):
# include <stdio.h>
# include <stdlib.h>
# include <time.h>
int main(void)
{
int n;
srand((int)time(NULL));
printf("你想生成隨機數的最大值是多少?\n");
scanf("%d",&n);
for(int i = 0; i<5; i++)
{
double t =(double)rand()/32767;//產生一個[0,1]內的隨機數
double c = t*n;//將他變成你想要的範圍
printf("%d\n",(int)c);
}
return 0;
}
結果:
三.注意:
1.srand()函式是用來初始化隨機數種子的,種子決定序列,種子相同,序列也就相同,每次產生的隨機數也就相同,而且srand()只需要執行一次,不要在程式中多次使用它,防止產生相同的隨機數。
2.關於time_t time(0):time_t被定義為長整型,它返回從1970年1月1日零時零分零秒到目前為止所經過的時間,單位為秒。
3.如果在程式中沒有使用srand()函式,那麼系統會預設給種子初始為0,所以每次產生的隨機數序列都是一樣的,這個要注意。
Java
一:函式
1.Math.random()
該函式會預設生成[0,1)內的隨機數,注意1不閉合。所以你要產生某一範圍內的隨機數就要最後加上1.
二:函式的使用
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("你想要的範圍最大數:");
java.util.Scanner input = new java.util.Scanner(System.in);
double n= input.nextDouble();
for(int i = 0; i<5; i++)
{
System.out.println(Math.random()*n+1);
}
}
}
結果:
3.java很方便吧