一、先來教個新技巧:把小數無條件捨去及四捨五入
圖片參考:http://programming.im.ncnu.edu.tw/J_index.html
常用的 int範圍是整數,要小數的話,就用float或double,而double的範圍是實數
以下是把小數無條件捨去的方法:
public static void main(String[] args)
{
int x;double y =3.14159;
x = (int)(y);
System.out.println(x);
}
用括弧框住特定指令,即可獲得特定值的特定部分
若要改成四捨五入:
public static void main(String[] args)
{
int x;double y =3.666;
x = (int)(y+0.5);
System.out.println(x);
}
加0.5即可XD
二、產生亂數Math.random
範圍:0<=Math.random<1
public static void main(String[] args)
{
for(int i=1;i<11;i++)
{
System.out.println(Math.random());
}
}
此為模擬的亂數(蒙地卡羅亂數),連用兩次會產生不同的亂數
三、製作物件,mylib.Rand/0~n和m~n的隨機整數
令R'=(int)(Math.random())
0<=R'<1
0<=R'*(n+1)<(n+1) ...同乘n+1
0<=R'*(n+1)<=n ...變號
這樣R'*(n+1)就是一個[0,n]的隨機整數了
static int Rand(int n)
{return((int)(Math.random()*(n+1)));}
0<=R'<1
0<=R'*(n-m+1)<(n-m+1) ...同乘(n-m+1)
0<=R'*(n-m+1)<=n-m ...變號
m<=R'*(n-m+1)+m<=n-m+m ...同加m
m<=R'*(n-m+1)+m<=n
放回Java就是:(int)(Math.random()*(n-m+1)+m);
static int Rand(int m,int n)
{return(Rand(n-m+1)+m);}
關於隨機整數的詳細圖文推導點此( ゚∀゚)つ≡≡≡♡♡♡)`ν゜)グシャ
四、隨機六個不重複的數字(猜樂透)
public static void main(String[] a)
{
int x,y,z=0;int []m=new int[6];
m[0]=mylib.Rand(1,49);//第一個數字
for(x=1;x<=5;x++)//第2~6的字
{
m[x]=mylib.Rand(1,49);
z=0;//先假設while false不用再做一次,一次就成功
do
{
for(y=0;y<x;y++)
{
m[y]=mylib.Rand(1,49);//同一個m陣列,重複叫出前面幾格的數字
if(m[x]==m[y])//檢測(比較)有沒有相同(若數字與之前的相同就跳出)
{ //表示這個字不能選用
z=1;break;
}
}
}while(z==1);//如果z==1就再執行一次
}
for(x=0;x<=5;x++)
{
System.out.print(m[x]+" ");
}
}
五、猜數字雛形
可改進空間:
1、布林運算的檢定可以用!直接取代
2、應該要顯示猜過的數字,縮小範圍並顯示出來
3、最後顯示"恭喜猜中"一般是放在最後面,以增加效能
六、最終版20170327s2
public static void main(String[] args)
{
int n,m1=1,m2=1000;int ans=mylib.Rand(m1,m2);
do
{
n=Integer.parseInt(mylib.Input(m1+"~"+m2+"猜個數字:"));
if(n>ans){m2=n;}
else if(n<ans){m1=n;}
}while(n!=ans);
System.out.println("You win~lalalala:)");
}
可改善空間:
1、用try-catch限制只能輸入數字
2、當範圍越來越小,限制不能輸入範圍以外的數字(比如現在是400~550之間,應禁止輸入<400及>550);Bug:可以輸入>-1和>1000,範圍會跟著變大