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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

今天逛黑马论坛,看到一个兄弟在论坛发了一个题目,我看好多点击量,却没人回答。。。于是我就想说做来练习练习没想到一弄就是2个小时...现在发现有不少值得记录下来的东西,就在此整理整理!题目是这样的,想要随机产生一堆数,然后让其结果都等于一个固定值!我刚开是看到就想,这没什么难的嘛,定义个Random 再随机一些数加起来,用固定值减去这些数,得出的结果赋值给最后一个数,这样无论怎么产生数都行了。后面发现题目还要求不能是负数。我就想,那就写个循环让他跑,跑出出的数如果大于给出的固定值那就重跑,一直跑到小于固定值,然后用固定值减去总和得出最后一个数就OK了。但是在定义
循环的时候遇到了不少问题!下面一起来看看代码啦。。。

import java.util.ArrayList;
import java.util.Iterator;
import java.util.Random;
public class Test {
public static void main(String[] args)throws Exception
{
    int y=24;//取6个随机数,有一个数根据取的5个数来做改变
    int sum=301;//给定的固定值,也就是所有随机数的和
    ArrayList<Integer> al=new ArrayList<Integer>();//定义一个集合装数
    int tmep=0;//定义一个临时储存空间
    boolean flag1=true;//定义两个标志。。多亏了这样个标志。。。
    boolean flag2=true;
    Random r=new Random()
     while(flag2)//先是外循环,如果没有取到合适的数就一直循环
    {
        while(flag1)
        {
            tmep=0;//空间清0,因为会循环回来
            al.clear();//数组清零。同理      
            for(int x=0;x<=y;x++)//循环取数,
            {
                int num=r.nextInt(50);//取50行了,才50里面随机出数据。不过到100了就很难找。毕竟要26个数
                al.add(num);把取出来的数存入数组
            }
            Iterator<Integer> it=al.iterator();//迭代器
            while(it.hasNext())
            {
                tmep=it.next()+tmep;//遍历所有的数后累加起来
                if(tmep<sum)//判断累加后的数是否在固定值范围内
            {
                flag1=false;//在范围内就让两个标志false让循环结束!!!
                flag2=false;
            }
            else//否则就封闭内循环
            {
            flag1=true;
            flag2=false;
            }
            }
         }
    }
    int a=sum-m;//计算出最后一个值
    al.add(a);//存入数组
    for(int s: al)//遍历数组,输出结果!
    {
        System.out.print("随机数:"+s+"

  }

}


}

主要是标志哪里弄了不少时间,一不小心就写成死循环了,eclipse down掉几次...- - 还是用cmd不容易挂!大家有兴趣的看看,有更好的点子欢迎补充!我觉得我这个方案不太行,太浪费资源了~~





评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 淡定

查看全部评分

7 个回复

正序浏览
郑飞 高级黑马 2014-11-11 04:32:29
8#
本帖最后由 郑飞 于 2014-11-11 04:42 编辑

一个for循环就可以了  就是每次控制随机数范围 最后一个数用固定-总和
  1. public class Test {//总和设置350,个数为5
  2.         public static void main(String[] args)
  3.         {
  4.                 int[] arr = new int[5];
  5.                 int s = 0;
  6.                 for(int i = 0 ; i<4;s+=arr[i],i++)
  7.                         arr[i] = new Random().nextInt(70*(i+2)-s);
  8.                 arr[4] = 350 - s;
  9.                 for(int i : arr)
  10.                         System.out.print(i+" ");
  11.         }
  12. }
复制代码

回复 使用道具 举报
虽然没学异常还是留名
回复 使用道具 举报
过来学习
回复 使用道具 举报
学习了。。。。。
回复 使用道具 举报
冥夜 发表于 2014-11-9 22:59
感觉浪费资源+1,个人思路:先弄出一定数量的随机数,然后用和减这些随机数,最后不符合就重新生成再覆盖已 ...

嗯,就是觉得有点浪费资源,不小心还跑个未响应!!不过你说覆盖如何覆盖?我直接把数组清零了重新取过这样也会比较浪费么?
回复 使用道具 举报
冥夜 发表于 2014-11-9 22:59
感觉浪费资源+1,个人思路:先弄出一定数量的随机数,然后用和减这些随机数,最后不符合就重新生成再覆盖已 ...

嗯,就是觉得有点浪费资源,不小心还跑个未响应!!不过你说覆盖如何覆盖?我直接把数组清零了重新取过这样也会比较浪费么?
回复 使用道具 举报
感觉浪费资源+1,个人思路:先弄出一定数量的随机数,然后用和减这些随机数,最后不符合就重新生成再覆盖已生成的随机数,这样资源浪费少点。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马