打印

关于迅雷笔试题

[复制链接]
1507|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
秋天落叶|  楼主 | 2012-8-27 17:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//求解0-n中(包含0,但不包含n)m个不重复随机数的算法.
void knuth(int n, int m)
{
    srand( (unsigned)time( NULL ) );
   
for( int i =
0; i < n; i++)
    {
        
if( rand()%(n-i) < m)
        {
            cout
<< i <<
"\t";
            m
--;
        }
// end if
    }//end for

return;
}
不理解点:
1.if( rand()%(n-i) < m)
{
cout << i << "\t";
m--;
}// end if
此处if语句的思路是什么?
个人理解到的:
1)通过m来控制个数。因为题意是求解[0,n-1]的m个不重复的数。
2)rand()%(n-i)即求解的随机数除以(n-i)的余数,此处n-i的值
取为{n,n-1,n-2,...1}.
但串起来还是不太理解此处的思路,望大家指点提示,谢谢!
或者对于求解不重复随机数有没有更好的方法或思路也可以交流。
以前写过,但是比这要复杂很多,这是我见到的最简洁的一种。

相关帖子

沙发
hsbjb| | 2012-8-27 18:08 | 只看该作者
这迅雷的笔试题难度还不小

使用特权

评论回复
板凳
火箭球迷| | 2012-8-27 18:38 | 只看该作者
由题意m必定小于n,从0至n-1中找出m个随机数,那么这n个数可以分为两组:要求的不重复的随机数(m个)+非要求的随机数(n-m个);i不断自增,n-i不断自减,所以 rand()%(n-i)最终会为0,而每得出一个要求的不重复的随机数,m自减,所以m最终也为零,所以当一共得带来m个要求数,循环会停止;if判断i是否为随机数的依据是rand()%(n-i)和m相比,可能是大于,也可能是小于,结果是随机的,而每个数符合条件的概率是m/n

使用特权

评论回复
地板
shenmulzb1985| | 2012-8-28 13:39 | 只看该作者
这样的代码最好的办法就是调试调试的了啊,每一步的调试,最后的功能怎会实现的

使用特权

评论回复
5
yybj| | 2012-8-29 23:40 | 只看该作者
很面熟的笔试题

使用特权

评论回复
6
无冕之王| | 2012-8-29 23:56 | 只看该作者
见3楼的分析,很全面了

使用特权

评论回复
7
xsgy123| | 2012-8-30 00:09 | 只看该作者
看了3楼大侠的分析,还是没太看明白

使用特权

评论回复
8
txcy| | 2012-8-30 00:17 | 只看该作者
比腾讯的笔试题还是简单一点

使用特权

评论回复
9
秋天落叶|  楼主 | 2012-8-30 19:03 | 只看该作者
应该总结下各个名企的笔试题,对找工作应该很有帮助

使用特权

评论回复
10
summerlover| | 2012-9-3 20:11 | 只看该作者
看来迅雷不是一般能进的

使用特权

评论回复
11
shenmulzb1985| | 2012-9-4 14:09 | 只看该作者
再次看了下的这题目,的却不太容易的啊,看来数学没学好啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:落叶很美

138

主题

3044

帖子

1

粉丝