Chinaunix

标题: 随机数 求点想法 [打印本页]

作者: week008    时间: 2006-12-13 15:40
标题: 随机数 求点想法
 假如随机数取值在0-9,当第一次取了0后,接下来的9次不希望取到0,同理当第二次取到1后接下来的8次不希望取到1;
 程序不希望记录前面所有取得的随机数,最多记录最近一次取得的随机数,当进行完前面10次后,接下来的10次希望不重复前面的10次取值顺序,请教大家有什么好的思路或算法.
作者: Edengundam    时间: 2006-12-13 16:08
不明白你说的什么记忆.

生成一个很长的随机数, 然后10位10位的进行操作, 如果有重复的就压缩成一个, 然后用 10 位和前面的 10 位进行对比, 重复了就丢弃.
作者: hellioncu    时间: 2006-12-13 16:33
定义一数组,保存0-9,生成随机数把这数组内容随机掉换
作者: sithui    时间: 2006-12-13 17:58
i = rand();
k = i;
while(1){
AGAIN:    i = rand();
               if(k == i ) goto AGAIN;
               else{
                        k = i;
                        printf("%d", i);
               }
}
作者: 灰色骆驼    时间: 2006-12-13 19:52
最多记录最近一次取得的随机数,这就难办了!
作者: week008    时间: 2006-12-14 10:55
这个问题难的地方是最多记录最近一次取得的随机数, 上面四位只有灰色骆驼 理解了我的意思, 其他三位都保存了之前取得的所有数,sithui 的代码只能保证最后一次出现的随机数在接下来的一次不出现,而不能保证下下一次不出现.
  如果保存之前所有出现的随机数,那对于算法是没有意义了,只是耗用内存来解决问题.如果一个程序同时向100万人提供他的随机数,用内存的方法消耗太大了,效率也低,所以想用一个好的算法.
  基本的想法是为每个请求随机数的人设一个种子,接下来的问题就是题目所示了,想不出来。。。。。。。。。。。。。
  请大家帮忙!!!!
作者: Edengundam    时间: 2006-12-14 11:06
原帖由 week008 于 2006-12-14 10:55 发表
这个问题难的地方是最多记录最近一次取得的随机数, 上面四位只有灰色骆驼 理解了我的意思, 其他三位都保存了之前取得的所有数,sithui 的代码只能保证最后一次出现的随机数在接下来的一次不出现,而不能保证下下一次 ...


如果你能开发这种算法, 估计就能得图灵奖了...

我无法想象什么机器能在一瞬间为100万用户提供足够的响应时间...相信这样的computer..还见不到...
作者: week008    时间: 2006-12-14 16:10
原帖由 Edengundam 于 2006-12-14 11:06 发表


如果你能开发这种算法, 估计就能得图灵奖了...

我无法想象什么机器能在一瞬间为100万用户提供足够的响应时间...相信这样的computer..还见不到...


我说的是同时为100万用户提供服务,没有说一瞬间为100万用户提供服务,我要做的是在一个用户上他得到的随机数是不和他之前得到的是重复的,明白吗?
作者: sithui    时间: 2006-12-14 17:56
哦,我没看仔细,见笑了
按楼主说的只在0-9  10个数字中取的话可以用一个10个元素的数组来记录,取完10个清空数组,这样系统开销不会很大

如果是在一个很大的区间要达到这样一个效果的话,真是不好办了

[ 本帖最后由 sithui 于 2006-12-14 17:58 编辑 ]
作者: Edengundam    时间: 2006-12-14 19:23
原帖由 week008 于 2006-12-14 16:10 发表


我说的是同时为100万用户提供服务,没有说一瞬间为100万用户提供服务,我要做的是在一个用户上他得到的随机数是不和他之前得到的是重复的,明白吗?



你直接生成好100万的数据, 来一个分配一个不就完了. 10! = 3628800, 容量足够.
作者: JohnBull    时间: 2006-12-14 22:26
man strfry

利用一下即可。
作者: tyc611    时间: 2006-12-14 23:32
原帖由 JohnBull 于 2006-12-14 22:26 发表
man strfry

利用一下即可。

在Cygwin里man了下,没有
没有系统,能介绍下吗?
作者: JohnBull    时间: 2006-12-14 23:38
原帖由 tyc611 于 2006-12-14 23:32 发表

在Cygwin里man了下,没有
没有系统,能介绍下吗?


简单地说就是一个“洗牌”用的函数,把一个字符串随机打乱顺序。
作者: tyc611    时间: 2006-12-14 23:51
原帖由 JohnBull 于 2006-12-14 23:38 发表


简单地说就是一个“洗牌”用的函数,把一个字符串随机打乱顺序。

谢谢!
作者: zlrll    时间: 2006-12-15 09:34
原帖由 JohnBull 于 2006-12-14 23:38 发表


简单地说就是一个“洗牌”用的函数,把一个字符串随机打乱顺序。


谢谢,又学到了一招,呵呵
作者: sithui    时间: 2006-12-15 10:52
strfry
是不是只在GNU C里才有?

另外,我对楼主的问题有个疑问
如果是在0-9中间取的话,按楼主的要求,当取到第9个数时就不用取第10个数了,根据前面9次的结果很容易推知第10个数,同样,第9个数也是2选1 -- 这样好像跟随机数的定义不太相符了

[ 本帖最后由 sithui 于 2006-12-15 10:58 编辑 ]
作者: 洋没吐气    时间: 2006-12-15 10:59
原帖由 JohnBull 于 2006-12-14 23:38 发表


简单地说就是一个“洗牌”用的函数,把一个字符串随机打乱顺序。



这个方法不错!
学到一个更好的方法了




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2