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很方便吧