A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© y96352 中级黑马   /  2013-6-16 07:21  /  1352 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 y96352 于 2013-6-16 12:04 编辑

在50楼内随机抽取10个幸运的人 奖励***
int i = 0;
            Random r = new Random();
            
            int[] s2 = new int[10];//建立的数组没有赋值 默认都是0
            do {
                int a = r.Next(1, 51);//随机取1-50楼

                if (i == 0)
                {
                    s2 = a;
                }
               
                if  (i>=1)
                {
                    for (int c = 0; c < i; c++)
                    {
                        if (a == s2[c])//判读是否有相等的数
                        {
                            continue;
                        }
                        else
                        {
                            s2 = a;
                           
                        }
                    }
                }
                i++;
            }
            while (i < 10);
            foreach (int s1 in s2)
            {
                Console.WriteLine(s1);
            }
            Console.ReadKey();
但是我写后运行结果老是有重复的 哪里有问题 大家可以帮我看下吗

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

5 个回复

倒序浏览
感觉你这个程序没写好,但我还是在你基础上修改
  1.             int i = 0;
  2.             Random r = new Random();

  3.             int[] s2 = new int[10];//建立的数组没有赋值 默认都是0
  4.             do
  5.             {
  6.                 int a = r.Next(1, 51);//随机取1-50楼

  7.                 if (i == 0)
  8.                 {
  9.                     s2[i] = a;
  10.                 }

  11.                 if (i >= 1)
  12.                 {
  13.                     int c;
  14.                     for (c = 0; c < i; c++)
  15.                     {
  16.                         if (a == s2[c])//判读是否有相等的数
  17.                         {
  18.                             break;//如果有重复的,直接退出当前循环
  19.                         }
  20.                     }
  21.                     if (c == i)//如果退出循环时,c和i相当,那么就是说没有找到重复的,给s2[i]赋值
  22.                     {
  23.                         s2[i] = a;
  24.                     }
  25.                     else
  26.                     {
  27.                         i--;//否则找到了重复的,将i-1,这里如果不自减的话,s2[i]的值将为0
  28.                     }
  29.                 }
  30.                 i++;
  31.             }
  32.             while (i < 10);
  33.             foreach (int s1 in s2)
  34.             {
  35.                 Console.WriteLine(s1);
  36.             }
  37.             Console.ReadKey();
复制代码
你写的这个主要问题就在于你如果a和s[c]相等,它还会继续和其他比,当相等时应该马上终止当前循环
所以你这个错误就在于只能和s[i-1]作比较,与s[i-1]不等则给s赋值

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 nilaoyededie 于 2013-6-16 08:30 编辑

看看我这个
            int i = 0;
            Random r = new Random();
            int[] s2 = new int[10];//建立的数组没有赋值 默认都是0
            do
            {
                int a = r.Next(1, 51);//随机取1-50楼

                if (i == 0)
                {
                    s2 = a;
                }
                bool bl = false;
                if (i >= 1)
                {
                    do//判断是否相等,相等重新赋值
                    {
                        a = a = r.Next(1, 51);
                        for (int c = 0; c < i; c++)
                        {
                            if (a == s2[c])//判读是否有相等的数
                                bl = true;
                        }
                        if (bl == false)
                            s2 = a;
                    }
                    while (bl);//如果为false就是又重复,循环重新赋值
                }
                i++;
            }
            while (i < 10);
            foreach (int s1 in s2)
            {
                Console.WriteLine(s1);
            }
            Console.ReadKey();

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 孤帆破浪 于 2013-6-17 17:06 编辑

我的意见是先不要急于给数组赋值,而是先判断产生的随机数是否符合要求。
static void Main(string[] args)
        {
            int i = 0;                 //迭代变量
            int[] num = new int[10];           //接收随机数的数组
            Random random = new Random();
            do
            {
                bool isRight = true;             //标识产生的随机数是否正确
                int r = random.Next(1, 51);    //先不要给数组赋值,用一个变量接收
                for (int j = 0; j < i; j++)     //判断随机数数组里面是否已有相同的数
                {
                    if (r == num[j])        //如果找到有相同的数,说明产生的随机数不正确,退出当前for循环
                    {
                        isRight = false;
                        break;
                    }
                }
                if (!isRight)     //如果产生的随机数不正确,就不执行if后面的代码,而是重新执行do-while循环,产生新的随机数      
                {
                    continue;
                }
                num = r;       //如果执行到了这里,说明产生的随机数符合要求,那么就给数组赋值
                i++;
            } while (i < num.Length);
            foreach (int item in num)
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();
        }

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
for (int c = 0; c < i; c++)
{if (a == s2[c])//判读是否有相等的数
{continue;}
else{s2[i] = a;}
你的错误在这里,当a==s2[c]时continue继续的是for (int c = 0; c < i; c++)这个循环,简单说在执行循环是只要是s2[c]中任意一个不等于a,s2[i]就已经被赋值
你可以在for (int c = 0; c < i; c++)设置断点查看运行过程
解决的方式就如2l、3l所示,将s2[i]的赋值转移到for (int c = 0; c < i; c++)这个循环外,for (int c = 0; c < i; c++)这个循环只单纯的作为赋值条件所在

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
{:soso_e142:}明白了  谢谢大家
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马