IT培训机构|91免费精品视频|专注编程培训|91免费精品|软件开发培训_91免费国产视频_华清远见教育

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > 只要運氣足夠好,一刀也能999!JAVA隨機數快速入門

只要運氣足夠好,一刀也能999!JAVA隨機數快速入門 時間:2018-12-24      來源:華清遠見

“隨機數”的本質代表了人類的不可預知性,這一特性在編程領域可以說是必不可少的。需要隨機數發揮關鍵性作用的例子幾乎隨處可見:游戲中的數值浮動、抽獎系統中的號碼生成、安全領域的秘鑰生成、服務器集群中的負載均衡……這些或大或小、或簡單或復雜的功能,都需要基于隨機數實現。

所以,本文的目的就是要用最簡單易懂的方式來介紹如何在Java中使用隨機數。

不過,在開始之前,首先需要明確的一點是:本文中介紹的Java自帶API生成的隨機數都是“偽隨機數”——生成它們的生成算法是一種叫做“線性同余”的算法,它接收一個數字作為種子,根據該種子輸出一個看似隨機的數字。這種算法的輸出雖然看似“隨機”,不過它的結果其實是有周期的(只是周期很長),而數論的知識又告訴我們:有周期的東西一定可以預言。這就宣判了Java API生成的隨機數并不是真正“隨機”的隨機數,其生成結果其實取決于種子的數值,換句話說,使用相同種子生成的“隨機數”一定相同,無論試多少次。

聽到這里,可能會有不少初學者對其表示失望。不過別急著走,實際上我們只需每次都找一個不同的種子,那么也能夠令其生成的結果看起來無限接近于“隨機”。

那么如何才能找一個“每次都不一樣”的種子呢?需要注意的是,種子可以是有規律的——這也是隨機數生成函數存在的意義(否則還要它干嘛)。這樣的“種子”在現實生活中或者程序中幾乎隨處可見:例如從1997年1月1日0時0分0秒到你現在看這篇文章的時間的每一個毫秒數——就都能滿足要求(它們都不同,數量也足夠,而且還能繼續擴展)。

正因如此,“偽隨機數”在絕大多數開發環境下都完全能夠發揮出類似于“真隨機數”的效果(那么到底能不能用計算機生成“真隨機數”呢?其實也是可以的,不過這不是本文要討論的內容)。

道理現在大家都懂了,接下來我們就用一些喜聞樂見的例子來展示如何在Java中使用隨機數。

在Java中,獲取隨機數的方法非常簡單。Java本身提供了兩個“開箱即用”的工具:一個是專門用于生成隨機數的工具類:java.util.Random;另一個則是Math類提供的用于生成隨機數的方法:Math.random()。

我們先從第一個,也是最容易理解的說起:Random類。

需要使用Random類,首先需要將其實例化。該類提供了兩種實例化方法:Random()和Random(long seed)

示例如下:

JAVA隨機數快速入門,java培訓

第一種構造器是最貼心的——它會自動找一個“盡可能與同一個程序中其它使用該構造方法生成的Random對象所使用的種子不同的種子”來構造一個新對象。嗯……聽起來可能比較拗口,簡單地說就是它會盡可能保證該對象提供的隨機數是完全“隨機”的。

第二種構造器則允許開發者使用指定的種子來生成隨機數,其類型是long(它存在的意義是:如果某一天您發明了一種史無前例完美的種子生成算法,能確保生成“真隨機數”,那么這種構造器就能派上用場)。

使用Random對象來生成一個隨機整形:

JAVA隨機數快速入門,java培訓

第一個方法是生成一個隨機整形,那么它能夠提供2^23種可能性。

第二種則是指定生成“0-給定范圍”的隨機數。例如上圖的示例中,其返回值將是0-99中的某一個數值。

很多情況下,上面提到的兩個方法足以應對絕大多數隨機數生成需求。不過,Random還提供了更多的隨機數生成形式:

JAVA隨機數快速入門,java培訓

上圖的示例中,從上至下依次用于:

1.生成一個隨機整形(前文已經提到了)

2.生成一個隨機雙精度浮點型

3.生成一個隨機布爾型

4.生成一個隨機浮點型

5.生成一個隨機長整形

6.使用隨機生成的byte結果填滿給定的byte數組

可以看出,都十分簡單。

編程是一門實踐的藝術。現在,我們就嘗試使用上述技術做一個很簡單并且有趣的游戲:在我們的Java世界中有一個“戰士”角色,它(暫定為“它”)每次攻擊都會打出一個隨機的傷害數值(這就像你玩過的大多數游戲那樣)。當然,我們的“戰士”是訓練有素的,因此其傷害值一定是在100以上,不會比這個值還低。但是這個“戰士”的力量也不是無限大,所以它造成的傷害數值最大只能達到200。也就是說,每一次攻擊,這位戰士根據發揮情況的不同會造成100-200之間的一個隨機傷害。

那么,該如何使用上面提到的隨機數技術來模擬一下該“戰士”攻擊5次的效果呢?

首先,我們將“戰士類”創造出來:

JAVA隨機數快速入門,java培訓

可以看出,上圖設計的“戰士”可以執行“攻擊”方法。不過現在這個方法只能返回0——這可不符合前文提到的要求。因此,我們需要賦予它一定范圍內的“力量”:

JAVA隨機數快速入門,java培訓

因為最低傷害值也要到100,因此我們就用100來做返回值的“基底”,在此基礎上,浮動范圍也是100,因此我們加上一個0-101(不包括)之間的隨機數作為最終結果。

注意,這里只需使用一個Random實例即可,因為每次使用該實例執行nextInt()方法時均會獲得一個新的隨機數,這也是不給定種子時的效果。

OK,設計工作完成。是時候讓這個“戰士”來展示一下自己的實力了:

JAVA隨機數快速入門,java培訓

上面的代碼中,我們創建了一個“戰士”實例并循環執行5次攻擊動作,效果是否像我們設計的那樣呢?

JAVA隨機數快速入門,java培訓

嗯,完美。雖然這一次這個“戰士”可能沒吃飽,攻擊力偏低了。我們再試一次:

JAVA隨機數快速入門,java培訓

可以看出,這次它的發揮要比上一次好很多。只要運氣好,次次都能打出200的逆天傷害也是有可能的(當然,概率學告訴我們這種情況非常少見)。

那么,如果我們給定一個“種子”,會怎么樣呢?例如這一次我們使用“1L”作為種子創建Random。你會發現:此時,這個戰士無論進行多少次測試,每5次的傷害數值均完全一致,包括順序(這里就不再用圖片演示了,可以自行體驗)。這也就驗證了前文提到的“隨機數生成算法依賴于種子”的說法。

那么Random說完了,接下來再介紹一下Math工具類提供的random方法:

JAVA隨機數快速入門,java培訓

可以看出,這一方法也很簡單,它是一個靜態方法,因此直接使用Math類進行調用即可。每次調用它均會隨機地返回一個范圍為0-1(不包括)的double型數值(它無法指定種子,因此使用起來更加簡單)。

我相信,有些初學者在第一次看到它會覺得很奇怪:為何這個方法要返回一個如此怪異的結果?

實際上,你能通過這個值獲得任意范圍的隨機數。不信?我們接下來繼續上面的例子:

現在,我們的“戰士”經過一段時間的刻苦努力,終于從1級的新手成長為99級的老手,傷害的可能值也成長為現在的100-999(下限沒變,上限提高了一大截)。

那么,我們該如何用Math提供的random方法來實現這一效果呢?

首先,我們依舊是采用100作為返回值的“基底”,那么浮動數值的取值范圍就是0-899(包括)之間。可是前文中已經提到了,Math提供的random方法只能返回一個隨機的、0-1之間的double數值。這該怎么辦?

先舉個簡單的例子,假如我要生成5-7(不包括)之間的隨機數(也就是只有5,6兩種取值),那么可以這樣獲取:

返回值=5+(int)((7-5)*Math.random())

例如,某一次random返回了0.2,那么7-5=2,2*0.2=0.4,轉換為int類型后變為0,最終返回值5+0=5。嗯,這個值確實是5-7之間的一個隨機數。

再例如,某一次random反悔了0.8,那么7-5=2,2*0.8=1.6,轉換為int后還是1,此時返回值5+1=6,依舊滿足條件。

綜上,我們可以看出,使用0-1之間的小數產生M到N之間的隨機數,可以根據以下公式獲得:

結果=M+(int)((M-N)*Math.random())

這樣一來,我們的戰士也就可以整裝待發了(之所以乘以900不是乘以899,是因為產生的隨機數無限接近但不包括最大值,因此我們要加上1):

JAVA隨機數快速入門,java培訓

如上。現在,我們再讓它來展示一下自己的實力:

JAVA隨機數快速入門,java培訓

效果如何呢?如下所示:

JAVA隨機數快速入門,java培訓

當然,和之前一樣,只要運氣足夠好,終有一天它能打出一刀999的傷害。

在此基礎上,還能添加暴擊效果,使其有一定幾率將傷害數值乘以2,或者添加miss效果,使其有一定幾率傷害為0……由此可見,按照這個原理繼續擴展的話,終有一天你也能寫出一套“只需體驗3分鐘”就能讓用戶愛上的款游戲作品了!

當然,那個目標可能并不容易實現。但是至少現在你應該已經掌握了在Java中方使用隨機數的方法了,這也是本文的意義所在!

感謝閱讀。

上一篇:Java中的權限修飾符

下一篇:嵌入式學科:冒泡排序

熱點文章推薦
華清學員就業榜單
高薪學員經驗分享
熱點新聞推薦
前臺專線:010-82525158 企業培訓洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,京ICP備16055225號-5京公海網安備11010802025203號

回到頂部

主站蜘蛛池模板: 欢迎光临广西七三科技有限公司官网 | 吉林省创智汇成包装有限公司,长春高档礼盒,长春包装盒厂家,长春精品包装盒 | 全铝家居_十大全铝家具品牌_全铝衣柜橱柜——佛山欧格美铝业 | 随车挖生产厂家_山东精久工程机械有限公司 | 中式婚礼_汉服婚礼_传统婚礼_婚庆公司_云歌婚礼策划【官网】 | 钠长石-硅铁-硅钙-孕育剂-球化剂-安阳李氏实业有限公司 | 中深世纪广告公司 深圳标志设计,深圳logo设计公司,包装设计公司,深圳商标设计,深圳画册设计公司 中商信息网-商务数据网-中文商务数据网 | 山东临沂春鑫新能源科技有限公司|官网|生物质颗粒锅炉|燃气锅炉|水源热泵 | 免费照片视频制作软件_照片做成视频的软件_制作照片视频的软件 - 万彩影像大师官网 | 托普云农-数字农业综合服务商-官方网站| 喷淋清洗剂,铝合金清洗剂-青岛爱大生环保科技有限公司 | 无锡大然新风环保设备有限公司-办公室空气净化器_商用空气净化器_酒店空气净化器 | 在线播放国产精品|哔咔漫画破解版永久vip兑换码|免费黄漫画|女被黄漫扒衣服软件|91精品麻豆 | 郑州环球重工机械有限公司建筑垃圾处理专题网站 | 江苏减速机_常州减速机_摆线减速机_摆线针轮减速机 | 青岛家政网【家政港】青岛家政保姆网络服务平台! | 三菱plc_触摸屏_变频器_欧姆龙plc_普洛菲斯_安川伺服电机-广州凌控 | 疝灯试验箱-有风源淋雨-汽车盐雾室-无锡苏南试验设备有限公司 | 西安防静电地板_防静电地板厂家_防静电地板价格_OA网络地板_写字楼架空地板_机房墙板安装-红梅防静电地板厂家直销 | 钻床,数控钻床,摇臂钻床,立式钻床_滕州市高地机床有限公司 | 饲料车_散装饲料车_畜禽运输车_散装饲料运输车_饲料车厂家_铝合金运猪车-程力专用汽车股份有限公司 | 卫生间隔断-东莞卫生间隔断-东莞卫生间隔断厂家-公共卫生间隔断-东莞市康丰家居建材有限公司 | 婴童人才网-孕婴童、母婴行业人才招聘求职系统 | 灭菌洗箱机_周转箱清洗机_隧道式洗箱机 - 环速科技有限公司 | 阻垢剂|缓蚀剂|杀菌剂|分散剂|水处理剂|印染助剂|水处理药剂|造纸助剂|膜阻垢剂|缓蚀剂|HEDP|ATMP|螯合剂-山东凯瑞化学有限公司 水处理药剂生产厂家 | 中国(北京)国际园林绿化设备展览会 | 实验反应釜,高压反应釜,玻璃反应釜,不锈钢反应釜-烟台招远松岭化工设备有限公司 | 洁净室、手术室、实验室、无尘车间厂房的净化工程装修设计施工公司-福临建设 | 宁波科迈尔工程机械有限公司-履带,底盘 | 激光焊接不锈钢翅片管,不锈钢翅片管,激光焊接复合翅片管,南通拓帆换热设备有限公司 | 无线对讲机系统-中继台-山区隧道信号覆盖-贝亚特 | 小麦硬度指数仪-石灰活性测定仪-智能型砂强度仪-北京同德创业科技有限公司 | 济宁山银煤矿机械有限公司,钻采工具,防爆电器,凿岩机械,风动工具,矿山机械,建筑机械,支护设备,通风防尘,铁路设备,仪器仪表,大型设备,矿用泵,钎具类,消防类,矿车类,配件区类 | 可燃气体报警器-有毒有害气体检测仪-气体检测分析系统-宁波市高品科技有限公司 | 卧式镗铣床,道斯镗铣机床加工中心-江苏道斯数控科技有限公司 | 上海汽车音响_上海汽车隔音降噪_上海汽车音响改装店_上海音豪 | 制砂机_制沙一体机_青石制沙机-华盛铭设备厂家 | 西安防静电地板_防静电地板厂家_防静电地板价格_OA网络地板_写字楼架空地板_机房墙板安装-红梅防静电地板厂家直销 | 盐城市宏展环保材料有限公司-官网-滤袋,过滤袋,液体过滤袋,袋式过滤器,无纺布过滤袋,废液过滤袋 盐城市城镇化建设投资集团有限公司[盐城国资企业、盐城国资集团、盐城文化旅游、盐城基础设施、盐城土地开发、盐城粮食收储] | 中国焊接协会网站—中国焊接信息网;焊接行业最权威访问量最大的专业网站:焊接信息、焊接材料,焊接机器,焊接设备,焊机,焊材,辅助设备,焊机配件,仪器仪表,电动工具,钎焊,送丝机,表面处理,自动化专机,焊锡丝,助焊剂 | 览众房车,房车, 房车厂家, 房车价格, 房车图片,, 四驱房车, 皮卡房车, 越野房车, 依维柯房车, 国产房车, 自动挡房车, |