2 u014767385 u014767385 于 2016.03.15 21:41 提问

C++求教,关于生成一组不重复的随机数
c++

函数是长这样的:(CUS和ROW都是提前define过的int,CUS是数组大小)

 void  randomA(int chosenCus[])
{
    srand((unsigned)time(NULL));
    for (int i = 0; i < CUS; ++i)
    {
        chosenCus[i] = rand() % ROW;
        for (int j = 0; j < i; ++j)
        {
            while (chosenCus[i] == chosenCus[j])
            {
                chosenCus[i] = rand() % ROW;
            }
        }
        cout << chosenCus[i] << " ";
    }
    cout << endl;
}

求问为什么还是会输出重复的?
且每次重复时,都是数组的最后一个数与之前某个数重复。
多谢各位!

3个回答

wtucsjianghua
wtucsjianghua   2016.03.15 22:48
已采纳

你的逻辑有问题,你的while循环的作用是当前的值与已经存在的值进行比较,只能保证当前值与已存在的最后的一个值不相等,不能保证与已存在的最后一个值的前面的值不相等(当数组长度大于等于3时就会出现你说描述的问题)。
举个例子,假如你的数组长度为3,前三个分别为2,1,最后一个如果是2,则while循环,如果1,与第二个值进行比较,1相等,则while循环,此时如果循环出现2,2与1不相等,但是循环已经结束了。你描述的问题就出现了。

wtucsjianghua
wtucsjianghua 回复ringo_lx: 不要while循环,直接发现相等,break跳出比较for,重新随机当前值
接近 2 年之前 回复
wtucsjianghua
wtucsjianghua 回复ringo_lx: 你这样就更复杂了,本来你的算法效率就很低了,再这样做这个就没法用了
接近 2 年之前 回复
u014767385
u014767385 。。。是不是在while里面再套一个循环就可以了?再和前面所有的数比较?
接近 2 年之前 回复
u014767385
u014767385 明白了!非常感谢!能再请问一下吗,应该怎么实现我需要的功能呢?
接近 2 年之前 回复
u010559215
u010559215   2016.03.15 23:21

算法错误。
例如:
a[0] = 5, a[1]=8;
现在随机生成 a[2],
当j=0时,while循环确保a[2]不等于5,退出while;
然后j=1,while循环确保a[2]不等于8,当a[2]=5也会退出循环;这样a[0] = a [2] = 5。

u014767385
u014767385 ...好像这样逻辑还是不行啊。。。_(:зゝ∠)_
接近 2 年之前 回复
u014767385
u014767385 谢谢!请问我可以在while里面再套一个循环,再和前面所有的数比较吗?这样是不是就可以了?
接近 2 年之前 回复
John_ToStr
John_ToStr   Rxr 2016.03.16 14:48

很简单,当你需要的随机数数量比较大时。 你每生成一个随机数都要跟前面所有生成的随机数去比较,与其中的一个相等都不行,这种思路是合理的,试试吧

u014767385
u014767385 明白了,谢谢!
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!