?? subject_38615.htm
字號:
<p>
序號:38615 發表者:little_fisher1234 發表日期:2003-05-04 22:45:01
<br>主題:用VC如何實現好的整數隨機(輸入相同的數每次得到順序相同的的隨機序列)
<br>內容:我在加密實現中需要用到隨機序列,但用VC中的srand,rand()產生的隨機數很有規律性,如給定初值x=4,然后讓它每次加1或2或3,才運行幾十次,就發現產生了很多相同的隨機數!若是用srand(time())函數,產生的隨機數又不可控制,有沒有什么簡單的方法(包括一些比較經典的映射公式比如logistic map)可以實現呢!謝謝!
<br><a href="javascript:history.go(-1)">返回上頁</a><br><a href=http://www.copathway.com/cndevforum/>訪問論壇</a></p>
<hr size=1>
<blockquote><p>
回復者:凌仕曉 回復日期:2003-05-07 11:02:21
<br>內容:說具體點.
<br>
<a href="javascript:history.go(-1)">返回上頁</a><br><a href=http://www.copathway.com/cndevforum/>訪問論壇</a></p></blockquote>
<hr size=1>
<blockquote><p>
回復者:fisher1234 回復日期:2003-05-07 22:47:18
<br>內容:我有一個數組如B[]={1,2,3,4,5,6,7},我要使用隨機數,先給定一個初值,然后由隨機函數產生隨機下標,這樣我共要生成7個不同的隨機數得到7個下標,使得我對數組的使用變為例如:<BR>{2,4,5,3,1,7,6}或者其它,而且我可能還要進行十幾次這樣的操作,每一次都要求產生這樣一組排列(相當于給7張牌,每次洗牌)。但我要求由初值可以確定這十幾次生的排列具體是什么?這樣我可以返回去!有沒有講清楚!先謝謝你了!
<br>
<a href="javascript:history.go(-1)">返回上頁</a><br><a href=http://www.copathway.com/cndevforum/>訪問論壇</a></p></blockquote>
<hr size=1>
<blockquote><p>
回復者:凌仕曉 回復日期:2003-05-08 10:19:42
<br>內容:很簡單,先 srand((unsigned)time(NULL)); //#include"time.h"<BR>再 i=rand()%7;<BR>即可得到從 0 到 6 的隨機數;<BR>若想得到 1 to 7 只要 i=rand()%7+1;<BR>總之,rand()%r,可得到 0 to r-1 之間的隨機數,再在后面加上不同的基數,即可得到不同區間的隨機數。<BR>不知是否講清楚了?
<br>
<a href="javascript:history.go(-1)">返回上頁</a><br><a href=http://www.copathway.com/cndevforum/>訪問論壇</a></p></blockquote>
<hr size=1>
<blockquote><p>
回復者:fisher1234 回復日期:2003-05-08 12:16:22
<br>內容:首先謝謝你的回復喲!<BR> 可能我有點沒講清楚,就是我要的隨機不是真正的隨機,是那種細微改變初值就會產生完全不同結果,但由初值卻又是可以完全得到相同結果的隨機(好多隨機函數,其實也就是一些公式而已)<BR> 你說的方法好像就是我所擔心的不可控制,也就是說如果我給定初值2,經過一輪隨機數生成后比如得到的新的排列為<BR>{2,4,3,1,5,6,7}(第一輪)再繼續生成新的一輪排列如{1,5,4,6,3,7,2}(第二輪)以此繼續,可以產生許多新的排列。我的目的是用這些數組下標的排列對一個文件進行加密,不知道初值的人不知道我在某個時候用的時數組的哪一個,比如在這一時刻他不知道我用的是b[2]還是b[3]對文件進行了處理,達到保密的目的!然后得到一個加密后的結果,密鑰為初值。因此為了解密,我需要用初值再次產生隨機下標,但不能亂隨機,我必須讓第一輪的結果還是{2,4,3,1,5,6,7}第二輪的結果還是{1,5,4,6,3,7,2},這樣才能正確解密。你說的方法的確能產生好的隨機,但用相同初值,在不同時間運行程序它產生的結果第一輪就不可能是{2,4,3,1,5,6,7}了,我先前用的方法就是srand(初值) i=rand()%7,如果i已產生就則再執行rand()%7,直到得到一個沒有產生的i,本來沒什么問題,但我覺得效率比較低,因為我在調試的時候,發現rand()經常產生許多相同的以前產生過的隨機數,結果一%7,又得循環一次,所以如果需要產生好幾輪的話,效率就比較低!又什么好的方法嗎,不知道我羅嗦清楚沒有?
<br>
<a href="javascript:history.go(-1)">返回上頁</a><br><a href=http://www.copathway.com/cndevforum/>訪問論壇</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回復者:凌仕曉 回復日期:2003-05-08 20:57:36
<br>內容:我覺得你光用隨機不太行,我想可以用上一些數學公式,如 sin,cos等.<BR>像這樣:<BR>//#include "math.h"<BR>m=25;//初值;<BR>n=50;//加密數字串的長度;<BR>for(i=m;i<m+n;i++){j=(int)(sin(i*6.73)*100);/*......*/;}<BR>想得到 1 - 7 只要 j=(int)(sin(i*6.73)*100)%7+1;<BR>這樣完全可以由 m,n 重現這一串數字.當然公式可以搞得更復雜一些,<BR>不知這樣是否可以滿足你的需要?
<br>
<a href="javascript:history.go(-1)">返回上頁</a><br><a href=http://www.copathway.com/cndevforum/>訪問論壇</a></p></blockquote>
<hr size=1>
<blockquote><p>
回復者:林建華 回復日期:2003-05-09 13:00:46
<br>內容:fisher1234 你說的方法效率不低的,對現在的機器來說,這點時間可以忽略不計,你可以試試看重復做個10000次要多少時間,<BR>有的時候在可以接受的范圍內,沒有必要過分的考慮效率問題。
<br>
<a href="javascript:history.go(-1)">返回上頁</a><br><a href=http://www.copathway.com/cndevforum/>訪問論壇</a></p></blockquote>
<hr size=1>
<blockquote><p>
回復者:fisher1234 回復日期:2003-05-09 13:21:48
<br>內容:謝謝你們的回復!<BR>fire_woods你說的沒錯,我試了一下,的確還比較快!<BR>凌仕曉的思路很好,對我的思路有很好的啟發作用,我覺得可以試一試你的以及類似于你的方法。由于剛開始用C來做東西,所以問題可能多一些,以后還得向你們多多請教!
<br>
<a href="javascript:history.go(-1)">返回上頁</a><br><a href=http://www.copathway.com/cndevforum/>訪問論壇</a></p></blockquote>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -