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 明白了,谢谢!
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
C/C++: 生成不重复的一组随机数
在程序编写过程中,很多情况下回用到随机数,然而单纯的随机数不能保证每一次的数据都不同 下面方法返回一组不重复的数据1、方法//随机一组数据 std::vector<int> randVertor(int num) { std::vector<int> result; result.clear(); result.reserve(num); srand((int)ti
java 生成一组不重复的随机数
引出这个问题的是,是我在学习设计拼图游戏中出现的,拼图游戏开始的时候,图是散乱的,比如拼图游戏被分成了8*4 共32块,那么32块图对应着32个数,而若要使每次开始前的排列顺序不一致,就需要产生32个随机数。看过别人的方法,大郅的思想是0到32之间产生32个不同的随机数,所以创建了一个长度为32的Boolean数组用于存放产生的数字是否已经出现过,如果出现过,while循环会一直继续下去直到产生一
JS 生成一组不重复的随机数
随机产生一组介于指定范围的不重复的随机数。 1.主要实现 /// /// 生成一个指定范围的随机数 /// /// 起始值 /// 终止值 function newNumber(start,end){ return Math.round(Math.random()*(end-start)+start);//生成在[start,end]范围内的随机数值,只支持不小于0的合法范围
java 生成一组不同的随机数(不重复)
import java.util.Random; /**  * 生成一组不同的随机数  * arr{1,2,3,4,5,6}  * 比如随机生成了3 取出arr[3]=3,然后将arr{1,2,6,4,5,3} 数组模拟长度减1  * 比如随机生成了3 取出arr[3]=6,然后将arr{1,2,5,4,6,3} 数组模拟长度减1  * @author pindu  */
产生一组不重复随机数的高效算法
需要从 0 到 n 之间选 k 个不重复的数组成一个序列。 产生一组不重复随机数的高效算法
C#产生一组不重复随机数的两种方法
最近在开发项目的过程中,需要产生一些随机数,如果我们简单的用C#中的Random.Next方法,很难产生一组少重复的随机数(当然是伪随机数),在网上也看了很多方法,貌似也不可行,或者比较复杂。于是,参考网上的一些方法,自己写了两个个产生一组伪随机数的方法。 方法一的代码如下: List GenerateRandom(int iMax, int iNum){ List
如何产生n个不重复的随机数
问题:如何得到n个互相不重复的随机数? 如何实现randperm(n)的效果呢?本文提供了三种思路。
返回一组不重复随机数生成方法-(完美,100%不重复)
正好工作需要,需要一个方法能返回一组不重复的随机数,网上查了好多资料和实例。发现都是加时间种子的比较多。 最后自己想到了好办法。效率也高。100%不重复。 下面贴出代码:         ///         /// 返回一组不重复随机数生成方法-(完美,100%不重复)。         ///  min 最小数,max 最大数,num 输出个数         ///  吴官迪
如何产生一个不重复的随机数
这是我在写一个Linux C聊天室的项目中需要产生一个随机数作为,用户登录的ID,本来直接用rand() % 10000 产生一个随机数,发现产生的随机数每次都是一样的。于是在网上查找了资料。 先来看一个例子:#include <stdio.h> #include <time.h>int main() { int i; int j; srand((int)time(NULL)
[转载]C语言随机输出1~20不重复的随机数
原文地址:C语言随机输出1~20不重复的随机数作者:米缸 #include #include #include void main() {  int a[20];  int i,j;  srand((int)time(0));  a[0]=rand()%20+1;  for(i=1;i  {   a[i]=rand()%20+1;   for(j=0;j   {