⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_38615.htm

📁 一些关于vc的问答
💻 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>内容:很简单,先&nbsp;&nbsp;srand((unsigned)time(NULL)); //#include"time.h"<BR>再&nbsp;&nbsp;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>&nbsp;&nbsp;&nbsp;&nbsp;可能我有点没讲清楚,就是我要的随机不是真正的随机,是那种细微改变初值就会产生完全不同结果,但由初值却又是可以完全得到相同结果的随机(好多随机函数,其实也就是一些公式而已)<BR>&nbsp;&nbsp; 你说的方法好像就是我所担心的不可控制,也就是说如果我给定初值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&lt;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 + -