BlogJava 聯(lián)系 聚合 管理  

          Blog Stats

          隨筆檔案


          bitmap

          bitmap

          2009年7月6日 #

               摘要: /**   * author:annegu  * date:2009-07-16   */ annegu做了一個(gè)簡(jiǎn)單的Http多線程的下載程序,來(lái)討論一下多線程并發(fā)下載以及斷點(diǎn)續(xù)傳的問(wèn)題。 這個(gè)程序的功能,就是可以分多個(gè)線程從目標(biāo)地址上下載數(shù)據(jù),每個(gè)線程負(fù)責(zé)下載一部分,并可以支持?jǐn)帱c(diǎn)續(xù)傳和超時(shí)重連。 下載的方法是do...  閱讀全文
          posted @ 2009-07-20 20:27 bitmap| 編輯 收藏

               摘要: ECC ECC-Elliptic Curves Cryptography,橢圓曲線密碼編碼學(xué),是目前已知的公鑰體制中,對(duì)每比特所提供加密強(qiáng)度最高的一種體制。在軟件注冊(cè)保護(hù)方面起到很大的作用,一般的序列號(hào)通常由該算法產(chǎn)生。     當(dāng)我開始整理《Java加密技術(shù)(二)》的時(shí)候,我就已經(jīng)在開始研究ECC了,但是關(guān)于Java實(shí)現(xiàn)ECC算法的資料實(shí)在是太少了,無(wú)論是國(guó)...  閱讀全文
          posted @ 2009-07-19 09:08 bitmap| 編輯 收藏

               摘要: DSA DSA-Digital Signature Algorithm 是Schnorr和ElGamal簽名算法的變種,被美國(guó)NIST作為DSS(DigitalSignature Standard)。簡(jiǎn)單的說(shuō),這是一種更高級(jí)的驗(yàn)證方式,用作數(shù)字簽名。不單單只有公鑰、私鑰,還有數(shù)字簽名。私鑰加密生成數(shù)字簽名,公鑰驗(yàn)證數(shù)據(jù)及簽名。如果數(shù)據(jù)和簽名不匹配則認(rèn)為驗(yàn)證失敗!數(shù)字簽名的作用就是校驗(yàn)數(shù)據(jù)在傳輸...  閱讀全文
          posted @ 2009-07-17 21:27 bitmap| 編輯 收藏

          最近與一位創(chuàng)業(yè)公司的朋友私下交流了一些項(xiàng)目管理和軟件開發(fā)的心得,是互聯(lián)網(wǎng)創(chuàng)業(yè)型公司,通過(guò)幾次的交流,加深了我對(duì)互聯(lián)網(wǎng)創(chuàng)業(yè)的一些感悟,本來(lái)不太想拿到桌面上說(shuō),但實(shí)在忍不住,還是想拿出來(lái)和希望創(chuàng)業(yè)的朋友討論下。

          那么我對(duì)互聯(lián)網(wǎng)公司的比較感興趣的地方主要體現(xiàn)在軟件質(zhì)量和技術(shù)管理方面,以下2點(diǎn)可以作為討論的提綱:

               1 軟件質(zhì)量,盡管質(zhì)量是我們嘴邊經(jīng)常掛念的一個(gè)詞,但不少創(chuàng)業(yè)型公司的投機(jī)心理太重,在與這些負(fù)責(zé)人的交流中發(fā)現(xiàn),談?wù)摰母嗟氖切孪敕ā⑿赂拍睿蟹浅V氐纳虡I(yè)氣息,當(dāng)然這沒什么不好,但我看了他們的一些產(chǎn)品后發(fā)現(xiàn),他們所做的產(chǎn)品用戶體驗(yàn)非常糟糕,就拿界面來(lái)說(shuō),非常的粗糙,由于有家公司做的產(chǎn)品和易趣類似,我特意打開2個(gè)窗口對(duì)比一下,總覺得易趣的看起來(lái)比較舒服,他們整體布局倒模仿易趣倒挺像,但問(wèn)題就體現(xiàn)在細(xì)節(jié)上,圖片失真嚴(yán)重、字體風(fēng)格不一致、細(xì)節(jié)處理的不到位。好了,那就湊合著看吧,發(fā)現(xiàn)該產(chǎn)品的功能非常的多,但讓人郁悶的是,很多功能是有問(wèn)題的,比如明明提示我系統(tǒng)給偶發(fā)了個(gè)郵件,但就是找不到,有時(shí)候提交表單是可以的,有時(shí)候見到一堆java異常錯(cuò)誤。所以我覺得這就是典型的追求功能的龐大而導(dǎo)致質(zhì)量的縮水。

              其實(shí)自從豆瓣開始流行后,大家都意識(shí)到功能做的簡(jiǎn)潔原來(lái)是有好處的,有不少創(chuàng)業(yè)者聲稱自己要向豆瓣看齊,鄙視csdn,堅(jiān)決走簡(jiǎn)潔之路,但讓我納悶的是,很少有人真正的堅(jiān)持下去,我有個(gè)同學(xué)06年底曾在一家創(chuàng)業(yè)公司玩過(guò)python,準(zhǔn)備做一個(gè)很有趣的網(wǎng)站,叫做抱怨網(wǎng),其實(shí)是蠻有創(chuàng)意的,不久前JE不是有個(gè)哥們?cè)谒奶幇l(fā)帖說(shuō)我愛我家黑中介的事,其實(shí)本來(lái)這個(gè)網(wǎng)站就是干這個(gè)事的,專門揭不良企業(yè)底的,但做著做著,成了巨無(wú)霸,開始是把大眾點(diǎn)評(píng)網(wǎng)的功能加進(jìn)去,接著又開始融進(jìn)趕集網(wǎng)的分類信息功能,最后有把智聯(lián)招聘的招聘功能加上了,結(jié)局就是1年不到,網(wǎng)站不出意料的死掉了,原因就是用戶體驗(yàn)差,根本不感興趣!最后我替他們老板做了下反思,其實(shí)說(shuō)實(shí)話,我還是很理解創(chuàng)業(yè)人的心,看到好東西都想要,而且之前幾年在互聯(lián)網(wǎng)圈錢誰(shuí)都眼紅。另外,他們的功能盡管是抄襲別人的,但還是有一定的特色與盈利模式,并且各個(gè)功能分的也蠻清的。 所以我覺得失敗的原因不能簡(jiǎn)單的歸結(jié)為功能太多,而是質(zhì)量,小公司也就那幾號(hào)人,作為開發(fā)人員,面對(duì)這么多的需求,只有拼命的趕進(jìn)度,丫還有時(shí)間考慮質(zhì)量或者用戶體驗(yàn)嗎?所以沒有一定的資本與一批強(qiáng)有力的管理和開發(fā)人員,切勿貪大求全,否則很可能就是在生產(chǎn)垃圾。其實(shí)質(zhì)量這個(gè)東西從高的層面上說(shuō)就是用戶體驗(yàn)的好壞,bug少不見得質(zhì)量高,但用戶體驗(yàn)差的東西絕對(duì)就是垃圾。

              最近市面上有個(gè)說(shuō)法有個(gè)說(shuō)法是30w足以模仿個(gè)淘寶,我認(rèn)為就是扯淡,誤導(dǎo)了很多創(chuàng)業(yè)者,認(rèn)為花點(diǎn)銀子,雇幾個(gè)人,就可以輕松抄襲淘寶了,咱先不說(shuō)市場(chǎng)投資,只談技術(shù),表面上看淘寶,丫就是一個(gè)破網(wǎng)站,但背后的技術(shù)你看的見嗎?穩(wěn)定性、性能、維護(hù)、可擴(kuò)展性,這些都和軟件質(zhì)量息息相關(guān),直接影響著用戶的滿意度,你確定真的做到了嗎?淘寶的架構(gòu)師一年的薪水也30w了。所以我覺得創(chuàng)業(yè)者要領(lǐng)悟毛澤東思想,采用各個(gè)擊破的戰(zhàn)術(shù),在有限的資源下約束的自己產(chǎn)品的功能,做到小而美。

               這里舉個(gè)正面的例子,有家位于芝加哥、名為37 Signals的小公司,正是這種擁抱限制的方式之代表者。37 Signals最初是一家網(wǎng)頁(yè)設(shè)計(jì)資訊公司,后來(lái)為了滿足自身需求而將業(yè)務(wù)擴(kuò)展到軟件開發(fā)領(lǐng)域。他們編寫了一些用于項(xiàng)目管理的內(nèi)部工具。為了和客戶溝通, 就向客戶開放了部分系統(tǒng)。公司創(chuàng)始人和總裁杰森•弗瑞德(Jason Fried)解釋說(shuō),在他們自己意識(shí)到之前,已經(jīng)做出了一套基于網(wǎng)頁(yè)的應(yīng)用。又做了4個(gè)月,他們把軟件轉(zhuǎn)換為稱作Basecamp的服務(wù)。 Basecamp發(fā)布于2004年2月,很快在類似Flickr和Google的Gmail等新Web富應(yīng)用天堂中名列前茅。

               Basecamp只是這家公司花一年多時(shí)間投入少量程序員做出來(lái)的一系列值得注意的小而精的產(chǎn)品之一。Basecamp之后是Ta-da List,用于保存和共享待辦事項(xiàng)(及類似事項(xiàng))列表。幾個(gè)月后推出了Backpack,它允許用戶保存和共享便簽及文件。每種產(chǎn)品都可靠并易于使用,而 且都是精心設(shè)計(jì)的。每種產(chǎn)品通常也都只包括少量新特性。例如,Basecamp就有一些精巧的電子郵件功能:和其他服務(wù)和程序一樣,也可以設(shè)置郵件到達(dá)提醒——還可以從另外的計(jì)算機(jī)或手機(jī)等移動(dòng)設(shè)備向Backpack網(wǎng)頁(yè)發(fā)送郵件,郵件文本就會(huì)在頁(yè)面上顯示出來(lái)。

               2 技術(shù)管理,你會(huì)發(fā)現(xiàn)很多公司的負(fù)責(zé)人不是很懂技術(shù),但卻是負(fù)責(zé)技術(shù)的,丫今天聽到SOA是個(gè)好東西,號(hào)令紛紛SOA,反正大家都不理解這個(gè)含糊不清的東西,做唄,看誰(shuí)能忽悠的過(guò)誰(shuí),一般來(lái)講,創(chuàng)業(yè)型公司為了節(jié)約成本,不會(huì)預(yù)留專門的QA,有專門的測(cè)試人員就不錯(cuò)了,所以缺乏一個(gè)質(zhì)量保證的環(huán)節(jié),遇到問(wèn)題怎么辦?誰(shuí)做的誰(shuí)改,改成什么樣沒人關(guān)心,只要負(fù)責(zé)人看到問(wèn)題解決了就可以了,但,我想問(wèn)的是,不良代碼背后的隱患你知道嗎?結(jié)果就是你咬牙給開發(fā)人員開工資,開發(fā)人員假裝幫你實(shí)現(xiàn)夢(mèng)想,或者說(shuō)造就一批劃水的人。其實(shí)很多東西不是錢的問(wèn)題,也不要以為多開點(diǎn)薪水就可以留住人心。另外我覺得很多技術(shù)負(fù)責(zé)人喜歡把東西模糊化,比如把軟件即服務(wù)的理念掛在嘴邊,但做起來(lái)是另一碼子事,我覺得作為一個(gè)技術(shù)負(fù)責(zé)人自己就要身先士卒,至少在創(chuàng)業(yè)公司是這樣,這樣才更有說(shuō)服力,遇到問(wèn)題自己應(yīng)當(dāng)?shù)谝粋€(gè)沖上去,拿出具體的解決方案,對(duì)代碼應(yīng)當(dāng)做到精細(xì)管理,做到心中有數(shù)。說(shuō)到底,創(chuàng)業(yè)公司得有一個(gè)技術(shù)核心,一個(gè)真正能實(shí)現(xiàn)你的想法的人,一個(gè)可以讓大家凝聚起來(lái)的人,不至于讓大家劃水的人。

          好了,先說(shuō)那么多,希望各位準(zhǔn)備創(chuàng)業(yè)的同仁能真正的樹立精品意識(shí),打造精品,實(shí)現(xiàn)夢(mèng)想

          posted @ 2009-07-14 13:14 bitmap| 編輯 收藏

          問(wèn)題的產(chǎn)生原因
                 頁(yè)面提交給Action去進(jìn)行業(yè)務(wù)處理,Action再跳轉(zhuǎn)回前臺(tái)頁(yè)面,但這時(shí)URL依然是“頁(yè)面提交給Action的鏈接”,這時(shí)前臺(tái)刷新一下頁(yè)面,就變成再次執(zhí)行了一次提交操作。

           

          解決思路
               1,在Action頁(yè)面中跳轉(zhuǎn)的時(shí)候用重定向,可以在struts-config.xml中配置<forward ... redirect=“true”>
          不過(guò)這種方法會(huì)使得request中放置數(shù)據(jù)丟失;
               2,用Token令牌環(huán)來(lái)實(shí)現(xiàn)
                    提交到Action的時(shí)候,進(jìn)行一系列操作,然后保存一個(gè)標(biāo)志,這時(shí)再跳轉(zhuǎn)到前臺(tái)頁(yè)面。如果前臺(tái)頁(yè)面刷新的話,Action通過(guò)查看是否有標(biāo)志,就能判斷用戶是刷新還是提交。

           

          Action中操作令牌的方法
                一: saveToken(HttpServletRequest request)
                      創(chuàng)建一個(gè)新令牌,并將其保存在當(dāng)前用戶的會(huì)話中,如果用戶的會(huì)話不存在,將首先創(chuàng)建新會(huì)話對(duì)象
                二: isTokenValid(HttpServletRequest request)
                      判斷存儲(chǔ)在當(dāng)前會(huì)話中的令牌值和請(qǐng)求參數(shù)中的令牌值是否匹配,如果匹配,返回true,否則返回false 。
                      以下情況返回false:
                            1,用戶的HttpSession不存在
                            2,用戶Session中沒有保存令牌值
                            3,在用戶請(qǐng)求參數(shù)中沒有令牌值
                            4,存儲(chǔ)在用戶Session范圍內(nèi)的令牌值和請(qǐng)求參數(shù)中 的令牌值不匹配
                 三:resetToken()
                       刪除保存在Session范圍內(nèi)的令牌值

           

          示例代碼

          1,進(jìn)入目標(biāo)頁(yè),如 http://www.bt285.cn ,通過(guò)IndexAction轉(zhuǎn)發(fā),其中需要保存令牌:

          public ActionForward execute(ActionMapping mapping, ActionForm form,   
                  HttpServletRequest request, HttpServletResponse response)   
                  
          throws Exception {   
              saveToken(request);   
              
          return mapping.findForward("index");// http://www.5a520.cn   
          }
            
           2,目標(biāo)頁(yè)面(test.jsp)需要使用Struts標(biāo)簽庫(kù):
          <body>  
              
          <html:form action=" http://www.5a520.cn test.do" method="post">  
                  
          <input type="submit" value="提交" />  
              
          </html:form>  
          </body>  
          當(dāng)提交test.jsp時(shí)提交到TestAction處理:
          <struts-config>  
              
          <form-beans>  
                  
          <form-bean name="testForm" type="com.tanlan.struts.form.TestForm">  
                  
          </form-bean>  
              
          </form-beans>  
              
          <action-mappings>  
                  
          <action path="/index" type="com.tanlan.struts.action.IndexAction">  
                      
          <forward name="index" path="/index.jsp"></forward>  
                  
          </action>  
                  
          <action path="/test" type="com.tanlan.struts.action.TestAction"  
                      name
          ="testForm" input="/index.jsp">  
                      
          <forward name="test" path="/test.jsp"></forward>  
                      
          <forward name="error" path="/error.jsp"></forward>  
                  
          </action>  
              
          </action-mappings>  
          </struts-config>  

          至此,大功告成!

          完整示例請(qǐng)參考附件。

           

          posted @ 2009-07-12 12:55 bitmap| 編輯 收藏

               摘要: 接下來(lái)我們分析DH加密算法,一種適基于密鑰一致協(xié)議的加密算法。 DH Diffie-Hellman算法(D-H算法),密鑰一致協(xié)議。是由公開密鑰密碼體制的奠基人Diffie和Hellman所提出的一種思想。簡(jiǎn)單的說(shuō)就是允許兩名用戶在公開媒體上交換信息以生成"一致"的、可以共享的密鑰。換句話說(shuō),就是由甲方產(chǎn)出一對(duì)密鑰(公鑰、私鑰),乙方依照甲方公鑰產(chǎn)生乙方密鑰對(duì)(公鑰、私鑰)。以此為基線,作...  閱讀全文
          posted @ 2009-07-11 20:01 bitmap| 編輯 收藏

               摘要: RSA     這種算法1978年就出現(xiàn)了,它是第一個(gè)既能用于數(shù)據(jù)加密也能用于數(shù)字簽名的算法。它易于理解和操作,也很流行。算法的名字以發(fā)明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman。     這種加密算法的特點(diǎn)主要是密鑰的變化,上文我們看到DES只有一個(gè)密鑰。相當(dāng)于只有一把鑰匙,如果...  閱讀全文
          posted @ 2009-07-09 21:08 bitmap| 編輯 收藏

          除了DES,我們還知道有DESede(TripleDES,就是3DES)、AES、Blowfish、RC2、RC4(ARCFOUR)等多種對(duì)稱加密方式,其實(shí)現(xiàn)方式大同小異,這里介紹對(duì)稱加密的另一個(gè)算法——PBE

          PBE
              PBE——Password-based encryption(基于密碼加密)。其特點(diǎn)在于口令由用戶自己掌管,不借助任何物理媒體;采用隨機(jī)數(shù)(這里我們叫做鹽)雜湊多重加密等方法保證數(shù)據(jù)的安全性。是一種簡(jiǎn)便的加密方式。



          通過(guò)java代碼實(shí)現(xiàn)如下:

           

          import java.security.Key;   
          import java.util.Random;   
            
          import javax.crypto.Cipher;   
          import javax.crypto.SecretKey;   
          import javax.crypto.SecretKeyFactory;   
          import javax.crypto.spec.PBEKeySpec;   
          import javax.crypto.spec.PBEParameterSpec;   
            
          /**  
           * PBE安全編碼組件 
          http://www.bt285.cn   http://www.5a520.cn 
           *   
           * 
          @author 梁棟  
           * 
          @version 1.0  
           * 
          @since 1.0  
           
          */
            
          public abstract class PBECoder extends Coder {   
              
          /**  
               * 支持以下任意一種算法  
               *   
               * <pre>  
               * PBEWithMD5AndDES   
               * PBEWithMD5AndTripleDES   
               * PBEWithSHA1AndDESede  
               * PBEWithSHA1AndRC2_40  
               * </pre>  
               
          */
            
              
          public static final String ALGORITHM = "PBEWITHMD5andDES";   
            
              
          /**  
               * 鹽初始化  
               *   
               * 
          @return  
               * 
          @throws Exception  
               
          */
            
              
          public static byte[] initSalt() throws Exception {   
                  
          byte[] salt = new byte[8];   
                  Random random 
          = new Random();   
                  random.nextBytes(salt);   
                  
          return salt;   
              }
             
            
              
          /**  
               * 轉(zhuǎn)換密鑰<br>  
               *   
               * 
          @param password  
               * 
          @return  
               * 
          @throws Exception  
               
          */
            
              
          private static Key toKey(String password) throws Exception {   
                  PBEKeySpec keySpec 
          = new PBEKeySpec(password.toCharArray());   
                  SecretKeyFactory keyFactory 
          = SecretKeyFactory.getInstance(ALGORITHM);   
                  SecretKey secretKey 
          = keyFactory.generateSecret(keySpec);   
            
                  
          return secretKey;   
              }
             
            
              
          /**  
               * 加密  
               *   
               * 
          @param data  
               *            數(shù)據(jù)  
               * 
          @param password  
               *            密碼  
               * 
          @param salt  
               *            鹽  
               * 
          @return  
               * 
          @throws Exception  
               
          */
            
              
          public static byte[] encrypt(byte[] data, String password, byte[] salt)   
                      
          throws Exception {   
            
                  Key key 
          = toKey(password);   
            
                  PBEParameterSpec paramSpec 
          = new PBEParameterSpec(salt, 100);   
                  Cipher cipher 
          = Cipher.getInstance(ALGORITHM);   
                  cipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);   
            
                  
          return cipher.doFinal(data);   
            
              }
             
            
              
          /**  
               * 解密  
               *   
               * 
          @param data  
               *            數(shù)據(jù)  
               * 
          @param password  
               *            密碼  
               * 
          @param salt  
               *            鹽  
               * 
          @return  
               * 
          @throws Exception  
               
          */
            
              
          public static byte[] decrypt(byte[] data, String password, byte[] salt)   
                      
          throws Exception {   
            
                  Key key 
          = toKey(password);   
            
                  PBEParameterSpec paramSpec 
          = new PBEParameterSpec(salt, 100);   
                  Cipher cipher 
          = Cipher.getInstance(ALGORITHM);   
                  cipher.init(Cipher.DECRYPT_MODE, key, paramSpec);   
            
                  
          return cipher.doFinal(data);   
            
              }
             
          }
            

          再給出一個(gè)測(cè)試類:
          import static org.junit.Assert.*;   
            
          import org.junit.Test;   
            
          /**  
           *   
           * 
          @author 梁棟  http://www.5a520.cn http://www.feng123.com
           * 
          @version 1.0  
           * 
          @since 1.0  
           
          */
            
          public class PBECoderTest {   
            
              @Test  
              
          public void test() throws Exception {   
                  String inputStr 
          = "abc";   
                  System.err.println(
          "原文: " + inputStr);   
                  
          byte[] input = inputStr.getBytes();   
            
                  String pwd 
          = "efg";   
                  System.err.println(
          "密碼: " + pwd);   
            
                  
          byte[] salt = PBECoder.initSalt();   
            
                  
          byte[] data = PBECoder.encrypt(input, pwd, salt);   
            
                  System.err.println(
          "加密后: " + PBECoder.encryptBASE64(data));   
            
                  
          byte[] output = PBECoder.decrypt(data, pwd, salt);   
                  String outputStr 
          = new String(output);   
            
                  System.err.println(
          "解密后: " + outputStr);   
                  assertEquals(inputStr, outputStr);   
              }
             
            
          }
            

          控制臺(tái)輸出:

        1. 原文: abc   
        2. 密碼: efg   
        3. 加密后: iCZ0uRtaAhE=   
        4.   
        5. 解密后: abc  

        6.  

           

          posted @ 2009-07-08 22:22 bitmap| 編輯 收藏

          一、利用random方法來(lái)生成隨機(jī)數(shù)。

            在Java語(yǔ)言中生成隨機(jī)數(shù)相對(duì)來(lái)說(shuō)比較簡(jiǎn)單,因?yàn)橛幸粋€(gè)現(xiàn)成的方法可以使用。在Math類中,Java語(yǔ)言提供了一個(gè)叫做random的方法。通過(guò)這個(gè)方法可以讓系統(tǒng)產(chǎn)生隨機(jī)數(shù)。不過(guò)默認(rèn)情況下,其產(chǎn)生的隨機(jī)數(shù)范圍比較小,為大于等于0到小于1的double型隨機(jī)數(shù)。雖然其隨機(jī)數(shù)產(chǎn)生的范圍比較小,不能夠滿足日常的需求。如日常工作中可能需要產(chǎn)生整數(shù)的隨機(jī)數(shù)。其實(shí),只要對(duì)這個(gè)方法進(jìn)行一些靈活的處理,就可以獲取任意范圍的隨機(jī)數(shù)。http://www.bt285.cn  http://www.5a520.cn  

            如我們可以先通過(guò)random方法生成一個(gè)隨機(jī)數(shù),然后將結(jié)果乘以10。此時(shí)產(chǎn)生的隨機(jī)數(shù)字即為大于等于0小于10的數(shù)字。然后再利用Int方法進(jìn)行轉(zhuǎn)換(它會(huì)去掉小數(shù)掉后面的數(shù)字,即只獲取整數(shù)部分,不是四舍五入)。最后即可獲取一個(gè)0到9的整數(shù)型隨機(jī)數(shù)字。其實(shí)現(xiàn)方法很簡(jiǎn)單,就是對(duì)原有的random方法按照如下的格式進(jìn)行變型:(int)(Math.Random()*10)即可。其實(shí)我們還可以對(duì)這個(gè)方法進(jìn)行擴(kuò)展,讓其產(chǎn)生任意范圍內(nèi)的隨機(jī)數(shù)。至需要將這個(gè)10換成n即可,如改為(int)(Math.Random()*n)。此時(shí)應(yīng)用程序就會(huì)產(chǎn)生一個(gè)大于等于0小與n之間的隨機(jī)數(shù)。如將n設(shè)置為5,那么其就會(huì)產(chǎn)生一個(gè)0到5之間的整數(shù)型的隨機(jī)數(shù)。如果將這個(gè)寫成一個(gè)帶參數(shù)的方法,那么只要用戶輸入需要生成隨機(jī)數(shù)的最大值,就可以讓這個(gè)方法來(lái)生成制定范圍的隨機(jī)數(shù)。在Java中定義自己的工具庫(kù)

            有時(shí)候程序員可能需要生成一個(gè)指定范圍內(nèi)的隨機(jī)偶數(shù)或者奇數(shù)。此時(shí)是否可以通過(guò)這個(gè)方法來(lái)實(shí)現(xiàn)呢?答案是肯定的。如現(xiàn)在程序要需要生成一個(gè)1-100范圍內(nèi)的偶數(shù)。此時(shí)該如何實(shí)現(xiàn)?首先,需要生成一個(gè)0到99之內(nèi)的隨機(jī)數(shù)(至于這里為什么是99,大家耐心看下去就知道原因了)。要實(shí)現(xiàn)這個(gè)需求,很簡(jiǎn)單吧,只要通過(guò)如下語(yǔ)句就可以實(shí)現(xiàn): i=1+(int)(Math.Random()*100)。其中(int)(Math.Random()*99)產(chǎn)生0到99的整數(shù)型隨機(jī)數(shù)。然后再加上1就是產(chǎn)生1到100之間的隨機(jī)整數(shù)。然后將產(chǎn)生的隨機(jī)數(shù)賦值給變量i。但是此時(shí)其產(chǎn)生的隨機(jī)數(shù)即有偶數(shù),又有奇數(shù)。而現(xiàn)在程序員需要的是一個(gè)隨機(jī)的偶數(shù)。那么我們可以在后面加上一個(gè)if判斷語(yǔ)句。將這個(gè)隨機(jī)數(shù)除以2,如果沒有余數(shù)的話(或者余數(shù)為0)則表明這個(gè)隨機(jī)數(shù)是偶數(shù),直接返回即可。如果其返回的余數(shù)不為零,那么就表明其是奇數(shù),我們只要加上1就變?yōu)榱伺紨?shù),返回即可。注意,在上面的隨機(jī)數(shù)生成中,筆者采用的范圍是0到99,然后再加上1讓其變?yōu)?到100的隨機(jī)數(shù)。最后的結(jié)果就是生成1到100之間的隨機(jī)偶數(shù)。其實(shí),如果要范圍隨機(jī)奇數(shù)的話,至需要對(duì)上面的語(yǔ)句進(jìn)行稍微的修改即可。Java:改變你我的世界

            假設(shè)現(xiàn)在用戶想生成一個(gè)任意范圍內(nèi)的奇數(shù)或者偶數(shù),能夠?qū)崿F(xiàn)嗎?假設(shè)現(xiàn)在用戶想實(shí)現(xiàn)一個(gè)m到n之間的任意偶數(shù)(其中m

            可見雖然random方法其自身產(chǎn)生的隨機(jī)數(shù)有比較嚴(yán)格的范圍限制。但是只要對(duì)其進(jìn)行合理的轉(zhuǎn)換,程序員仍然可以采用這個(gè)方法產(chǎn)生用戶所需要的隨機(jī)數(shù)據(jù)。

            二、通過(guò)Random類來(lái)生成隨機(jī)數(shù)。

            在Java語(yǔ)言中,除了可以通過(guò)random 方法來(lái)產(chǎn)生隨機(jī)數(shù)之外,還可以通過(guò)一個(gè)random類來(lái)產(chǎn)生隨機(jī)數(shù)。程序開發(fā)人員可以通過(guò)實(shí)例化一個(gè)Random對(duì)象來(lái)創(chuàng)建一個(gè)隨機(jī)數(shù)的生成器。如Random i=new Random()。通過(guò)這條語(yǔ)句就利用了Random類創(chuàng)建了一個(gè)隨機(jī)數(shù)的生成器。不過(guò)以這種方法創(chuàng)建隨機(jī)數(shù)時(shí),與采用Random方法產(chǎn)生隨機(jī)數(shù)的機(jī)制不同。利用現(xiàn)在這種方式實(shí)例化對(duì)象時(shí),Java編譯器會(huì)以系統(tǒng)當(dāng)前的時(shí)間作為隨機(jī)數(shù)生成器的種子。由于時(shí)間時(shí)時(shí)刻刻在變化的。若以這個(gè)時(shí)間作為生成器的種子,就可以保證生成的隨機(jī)數(shù)真的是隨機(jī)的,其生成的隨機(jī)數(shù)重復(fù)率會(huì)大大的降低。

            利用這種方法其比較方便。如可以利用提供的關(guān)鍵字,讓程序返回一個(gè)隨機(jī)的整數(shù)(采用int nextInt(10))等等。不過(guò)其返回控制要比Random方法困難一點(diǎn)。如現(xiàn)在需要系統(tǒng)提供一個(gè)10到50之間的隨機(jī)奇數(shù), 利用這個(gè)Random類就無(wú)法完成。也就是說(shuō),利用這個(gè)Random類來(lái)生成隨機(jī)數(shù),其只能夠控制上限,而不能夠控制下限。換一句話說(shuō),其可以指定最大的隨機(jī)數(shù)范圍,而不能夠指定最小的隨機(jī)數(shù)范圍。所以,在靈活性上,其比Random方法要稍微差一點(diǎn)。

            另外利用這個(gè)方法來(lái)實(shí)現(xiàn)的話,必須先創(chuàng)建一個(gè)對(duì)象。也就是說(shuō)利用Randow類來(lái)創(chuàng)建對(duì)象。這跟Randow方法不同。像上面舉的例子中,Randow方法本身就是一個(gè)math類中方法,可以直接調(diào)用,省去對(duì)象創(chuàng)建的方法。為此筆者建議各位讀者與程序開發(fā)人員,最好還是使用Random方法來(lái)創(chuàng)建隨機(jī)數(shù)。只有在生成一些比較特殊的隨機(jī)數(shù)時(shí)采用Random類。如現(xiàn)在需要生成一個(gè)概率密度為高斯分布的雙精度值隨機(jī)數(shù)時(shí),則通過(guò)采用Random類的方法來(lái)創(chuàng)建隨機(jī)數(shù)相對(duì)來(lái)說(shuō)比較簡(jiǎn)單一點(diǎn)。

          三、產(chǎn)生隨機(jī)的字符。

            上面介紹的兩種方法,產(chǎn)生的都是隨機(jī)的數(shù)值型數(shù)據(jù)。但是有時(shí)候用戶可能還需要產(chǎn)生隨機(jī)的字符。其實(shí)也可以利用random方法來(lái)產(chǎn)生隨機(jī)字符。如可以利用代碼生成一個(gè)隨機(jī)的小寫字符:(char)(‘a’+Math.random()*(‘z’-‘a’+1))。其實(shí)這跟生成任意兩個(gè)數(shù)之間的隨機(jī)數(shù)類似。通過(guò)以上的代碼就可以生成一個(gè)范圍之內(nèi)的任意隨機(jī)字符。通過(guò)對(duì)這個(gè)代碼進(jìn)行適當(dāng)?shù)男拚€可以生成任意兩個(gè)字符之間的隨機(jī)字符與任意大寫字符的隨機(jī)字符。其轉(zhuǎn)換的方式跟上面提到的任意范圍之內(nèi)的隨機(jī)數(shù)類似。各位讀者若感興趣的話,可以自己進(jìn)行測(cè)試一下。師傅領(lǐng)進(jìn)門,修行在自身。如果筆者在這里一股腦兒將所有的答案告訴大家,大家的印象不會(huì)很深。大家若回去自己動(dòng)手試試看,反而更容易記住。

            筆者在這里給大家一個(gè)提示,只需要根據(jù)m+(int)(Math.Random()*(n-m))這條語(yǔ)句來(lái)調(diào)整(char)(‘a’+Math.random()*(‘z’-‘a’+1))這個(gè)代碼即可。

            最后筆者需要強(qiáng)調(diào)的一點(diǎn)就是在用戶傳入?yún)?shù)的時(shí)候,最好要對(duì)用戶傳入的參數(shù)進(jìn)行合法性檢查。以免用戶傳入的參數(shù)不符合既定的要求,如參數(shù)需要的是數(shù)值型的數(shù)據(jù)而傳入的卻是字符型的數(shù)據(jù),而導(dǎo)致程序運(yùn)行出錯(cuò)。
          posted @ 2009-07-06 22:22 bitmap| 編輯 收藏

          主站蜘蛛池模板: 隆化县| 德保县| 永登县| 新和县| 苍南县| 娄烦县| 剑阁县| 湛江市| 陵水| 津市市| 北碚区| 都安| 马公市| 饶河县| 肇东市| 湖口县| 嘉定区| 宿迁市| 瓦房店市| 南雄市| 天台县| 河西区| 泽库县| 疏勒县| 当阳市| 茶陵县| 扎兰屯市| 游戏| 安塞县| 齐河县| 永清县| 贵港市| 绥中县| 贵州省| 宁乡县| 沅江市| 平塘县| 洪洞县| 乌兰察布市| 即墨市| 威海市|