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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 杨兴庭 于 2013-8-6 21:29 编辑

  double[] myList = new double[5];
for(int i = 0; i < myList.length; i++){
   int index = (int)(Math.random() * myList.length);
  //有问题,重复怎么办?不是会改变原数组中某个值?让某个值多重复一次,而某个值消失?
//比如第一次Math.random()的值为0.5,第二次又是0.5
   double temp = myList;
   myList = myList[index];//如果重复的话,那在这里,两个不同 i 的值却和同一个index对应,不就是错误了吗?
   myList[index] = temp;
}

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

17 个回复

倒序浏览
会重复的。因为随机生成的数字只要是在某一个范围内,生成的数字是不确定的,重复的数字是必须会有!
回复 使用道具 举报
不知道楼主这么做的意义在哪里 你的原意是甚么 小心脏经不起这般折腾~~~
回复 使用道具 举报
李慧声 发表于 2013-8-5 20:22
不知道楼主这么做的意义在哪里 你的原意是甚么 小心脏经不起这般折腾~~~

这是《Introduction to Java Programming》里面的一段程序,不是我想搞怎样啊。。。。
回复 使用道具 举报
本帖最后由 白堇翎 于 2013-8-5 20:31 编辑
  1. double[] myList = new double[5];
  2. for(int i = 0; i < myList.length-1; i++){
  3.      int index = (int)(Math.random() * myList.length);
  4.      //有问题,重复怎么办?不是会改变原数组中某个值?让某个值多重复一次,而某个值消失?
  5.     //比如第一次Math.random()的值为0.5,第二次又是0.
  6.     myList[i] = index;
  7. }
复制代码
既然是随机的 那就肯定会重复
另外代码应该这样写 如果你对结果不满意就多运行几次
另外我觉得这种生成随机数的方式实在太蛋疼 用Util包里的Random类里的方法会好一点

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
白堇翎 发表于 2013-8-5 20:29
既然是随机的 那就肯定会重复
另外代码应该这样写 如果你对结果不满意就多运行几次
另外我觉得这种生成随机 ...

初学者,还没学到怎么用你说的那个包~还有怎么把代码弄成像你那样,我是直接从我程序里粘贴来的
回复 使用道具 举报
余琪琪 发表于 2013-8-5 20:36
初学者,还没学到怎么用你说的那个包~还有怎么把代码弄成像你那样,我是直接从我程序里粘贴来的 ...


点红圈圈住的按钮
回复 使用道具 举报
本帖最后由 小发 于 2013-8-6 00:28 编辑
  1. public class Test3 {
  2.         public static void main(String[] args) {
  3.                 double[] myList = new double[5];
  4.                 for (int i = 0; i < myList.length; i++) {
  5.                         int index = (int) (Math.random() * myList.length);
  6.                         double temp = myList[i];
  7.                         myList[i] = myList[index];
  8.                         myList[index] = temp;
  9.                 }
  10.                 System.out.println(myList[4]);
  11.         }
  12. }
复制代码
//System.out.println(myList[4]);   楼主你试着修改这行代码中myList[4]中的值,你看结果是多少。
这句int index = (int) (Math.random() * myList.length);  求出来的index在后面只是作为数组的角标,根本没有赋值!所以不存在你说的改变数组中莫一个值的问题。
index的值为1-4之间的整数
而                   double temp = myList;
                        myList = myList[index];
                        myList[index] = temp;只是对数组进行重新排序。
我想程序应该没有意义。
下面的应该是程序想表达的意思-对一个数组进行随机排列。
  1. public class Test3 {
  2.         public static void main(String[] args) {
  3.                 double[] myList ={4,9,8,7,3};
  4.                 //System.out.println(myList.length);
  5.                 for (int i = 0; i < myList.length; i++) {
  6.                         int index = (int) (Math.random() * myList.length);
  7.                         double temp = myList[i];
  8.                         myList[i] = myList[index];
  9.                         myList[index] = temp;
  10.                 }
  11.                 for(int i=0;i<myList.length;i++){
  12.                         System.out.println(myList[i]);
  13.                 }
  14.         }
  15. }
复制代码

点评

很抱歉我的问题没说清楚,具体的在下面从新回复了  发表于 2013-8-6 17:04

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
Math.random是伪随机数,种子的选择会导致重复记录的多少,一般会选择时间作为种子的。
重复的可能性肯定有,只是概率有大有小的问题,可以设置取值的范围。
回复 使用道具 举报 1 0
/*
产生不重复的随机数
思路:
1,定义一个数组Number,存储随机数产生的范围
2,定义第二个数组result,用来记录产生随机数
3,生成随机数的下标r
4,把随机下标对应的数Number[r]储存到result数组中
5,把Number最后一个值赋给Number[r]中
6,把数组的长度减一
*/

import java.util.*;

class SignalRandom
{
        public static void main(String[] args)
        {
                Scanner in=new Scanner(System.in);
                sop("请输入要产生多少个随机数");
                int k=in.nextInt();

                sop("请输入要产生随机数的最大值");
                int n=in.nextInt();

                int []number=new int[n];
                for(int i=0;i<number.length;i++)
                {
                        number[i]=i+1;
                }
               
                int [] result=new int[k];
                for(int i=0;i<result.length;i++)
                {
                        int r=(int)(Math.random()*n);
                        result[i]=number[r];
                        sop("第 "+(i+1)+" 次产生的随机数是:"+result[i]);
                       
                        number[r]=number[n-1];
                        n--;
                }
        }
        public static void sop(Object obj)
        {
                System.out.println(obj);
        }
}


希望你看明白,这个是产生随机的不重复的数的代码。

点评

明白怎么用sop()了,但我的问题还是不明白。。。。  发表于 2013-8-6 17:03

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
白堇翎 发表于 2013-8-5 20:39
点红圈圈住的按钮

哦,了解了,3q
回复 使用道具 举报
  1.                                          double[] myList = new double[5];
  2.                 //(7)随意打乱
  3.                 for(int i = 0; i < myList.length; i++){
  4.                         int index = (int)(Math.random() * myList.length);
  5.                 //有问题,重复怎么办?不是会改变原数组中某个值?让某个值多重复一次,而某个值消失?
  6.                         double temp = myList[i];
  7.                         myList[i] = myList[index];
  8.                         myList[index] = temp;
  9.                 }
复制代码
很抱歉各位,我没说清楚,这个功能是为了打乱一个数组的。我认为,用Math.random(),之后会导致原数组有的元素重复增加,有的元素消失的问题。
回复 使用道具 举报
小发 发表于 2013-8-6 00:25
//System.out.println(myList[4]);   楼主你试着修改这行代码中myList[4]中的值,你看结果是多少。
这句int ...
  1. package day03;


  2. public class Text {

  3.         public static void main(String[] args) {

  4.                 int[] myList = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

  5.                 // System.out.println(myList.length);

  6.                 for (int i = 0; i < myList.length; i++) {

  7.                         int index = (int) (Math.random() * myList.length);

  8.                         int temp = myList[i];

  9.                         myList[i] = myList[index];

  10.                         myList[index] = temp;

  11.                 }
  12.                 System.out.print("[");
  13.                 for (int i = 0; i < myList.length; i++) {
  14.                         if (i != myList.length - 1)
  15.                                 System.out.print(myList[i] + " ");
  16.                         else
  17.                                 System.out.println(myList[i] + "]");
  18.                 }

  19.         }

  20. }
复制代码
把代码补充一下,以上代码运行结果是没错的,能将1-9重新排序,但是Math.random()导致重复的问题,不会产生影响吗?
回复 使用道具 举报
本帖最后由 薛鹏鹏 于 2013-8-6 18:15 编辑

可以重复,因为随机嘛。
你想说的是重复了会产生影响是吧?

重复了,产生的影响也无关紧要。因为你是交换它们的位置。我画了个图,你看看。          如果想保证随机数的唯一性,你可以换个容器,用Set来装。

QQ拼音截图未命名.png (18.17 KB, 下载次数: 76)

QQ拼音截图未命名.png

点评

非常感谢,讲的很清楚  发表于 2013-8-6 20:40

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1 赞一个!

查看全部评分

回复 使用道具 举报 1 0
本帖最后由 小发 于 2013-8-6 18:44 编辑
余琪琪 发表于 2013-8-6 17:13
把代码补充一下,以上代码运行结果是没错的,能将1-9重新排序,但是Math.random()导致重复的问题,不会 ...

楼上说的正确,是可以重复的因为你只是 交换了数组元素的位置。并没有改变数组元素的值 。
你要明确 index的取值范围是1-4之间的整数。
如果  i=index;
那么myList和myList[index] 就是数组中的同一个元素,

那么下面的代码  就是一个元素自己和自己换位置。
  1.                        double temp = myList[i];
  2.                         myList[i] = myList[index];
  3.                         myList[index] = temp;
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马