题目如下:定义一个长度为100的一维数组,数组的元素都是由0或者1构成,现给定一百分比,这百分比是可变的,假设为60%,即要求数组中值为0的元素个数的占数组个人的百分比不小于60%,那么应该采用一种什么样的思路给这个数组赋值呢?

解决方案 »

  1.   


    import java.util.Random;
    import java.util.Scanner;
    public class Test {
    public static final int MAX = 100;

    //根据需求,0的比率要大于等于M,那么1的比例就小于等于1-M
    public static void main(String[] args) {
    int[] arr = new int[MAX];

    Scanner input = new Scanner(System.in);
    System.out.println("请输入0所占的比率:");
    float percent = input.nextFloat();

    int num = MAX - (int)(percent * 100);

    //产生num个随机数,对以num为索引的数组元素赋值为1,
    //不管重复与否,因为这样的话,才能满足需求。如果这num个数
    //不重复,那么0的比率正好为M,否则0的比率就大于M
    Random random = new Random();
    int i = 0,n;
    while(i < num) {
    n = random.nextInt(MAX);
    arr[n] = 1;
    i++;
    }

    //打印出数组元素,每行10个
    for(i=0; i<arr.length; i++) {
    System.out.print(arr[i] + " ");
    if((i + 1) % 10 == 0)
    System.out.println();
    }
    System.out.println();
    }
    }
      

  2.   

           while(i < num) {
                n = random.nextInt(MAX);
                arr[n] = 1;
                i++;
            }
    这个算法我觉得打放进去的还是固定的1 并不是大于等于某个比例阿
      

  3.   

    import java.util.Arrays;
    import java.util.Random;public class Test {
        public static void main(String[] args) {
            // 定义总的长度和0的最少比个数.
            final int size = 100;
            final int minCountOf0 = 60;
            final int maxCountOf1 = size - minCountOf0;
            int[] bits = new int[size];
            
            // 产生一个随机数生成0的个数,其值比1的最多个数小.
            Random rand = new Random(System.currentTimeMillis());
            int countOf0 = minCountOf0 + rand.nextInt(maxCountOf1);
            int countOf1 = 0;
            
            // 初始化数组
            for (int i = 0; i < bits.length; ++i) {
                if (i < countOf0) {
                    bits[i] = 0;
                } else {
                    bits[i] = 1;
                    ++countOf1;
                }
            }
            
            // 输出数组的数据
            System.out.println("Count of 0: " + countOf0);
            System.out.println("Count of 1: " + countOf1);
            System.out.println(Arrays.toString(bits));
        }
    }
      

  4.   

    那就再加一个随机数k,是在0-num之间的,这样不就小于了么,大家认为呢
      

  5.   

    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    import java.util.Random;public class Test {
        public static void main(String[] args) {
            // 定义总的长度和0的最少比个数.
            final int size = 100;
            final int minCountOf0 = 60;
            final int maxCountOf1 = size - minCountOf0;
            List<Integer> bits = new ArrayList<Integer>();
            
            // 产生一个随机数生成0的个数,其值比1的最多个数小.
            Random rand = new Random(System.currentTimeMillis());
            int countOf0 = minCountOf0 + rand.nextInt(maxCountOf1);
            int countOf1 = 0;
            
            // 初始化数组
            for (int i = 0; i < size; ++i) {
                if (i < countOf0) {
                    bits.add(0);
                } else {
                    bits.add(1);
                    ++countOf1;
                }
            }
            
            // 输出数组的数据
            System.out.println("Count of 0: " + countOf0);
            System.out.println("Count of 1: " + countOf1);
            
            // 混淆列表中的内容
            Collections.shuffle(bits);
            System.out.println(bits);
        }
    }
      

  6.   

    我的思路:
    先定义一个数组 全部初始化为0然后输入一个百分比  比如说 60% , 那1-60% = 40%然后 做   40%*数组长度的向下取整次random.nextInt(数组长度),然后获得的int 作为下标填充对应数组元素的值为1,因为nextInt(数组长度)次操作,可能会有重复,所以1的个数最多就是40%*数组长度个
    代码如下:package chapter2;import java.util.Arrays;
    import java.util.Random;public class Test2 {

    int[] arr= new int[100];
    Random random = new Random(System.currentTimeMillis());
    public void test(double d){
    int num = (int)(arr.length*d);
    for(int i=0;i<num;i++){
    arr[random.nextInt(arr.length)] = 1;
    }
    }
    public static void main(String[] a){
    Test2 t = new Test2();
    t.test(0.4);
    System.out.println(Arrays.toString(t.arr));
    int count = 0;
    for(int i= 0 ; i < t.arr.length ; i++)
    {
    if(t.arr[i]==1)
    count++;
    }
    System.out.println("count:"+count);
    }
    }
      

  7.   

    按你的意思修改一下:package chapter2;import java.util.Arrays;
    import java.util.Random;public class Test2 {

    int[] arr= new int[100];
    Random random = new Random(System.currentTimeMillis());
    public void test(double d){
    int num = (int)(arr.length*(1-d));
    for(int i=0;i<num;i++){
    arr[random.nextInt(arr.length)] = 1;
    }
    }
    public static void main(String[] a){
    Test2 t = new Test2();
    t.test(0.6);
    System.out.println(Arrays.toString(t.arr));
    int count = 0;
    for(int i= 0 ; i < t.arr.length ; i++)
    {
    if(t.arr[i]==1)
    count++;
    }
    System.out.println("count:"+count);
    }
    }
      

  8.   

    哥们,楼上的说的没错,的确打印出来的都是0,这个我测过了,不信,您自己可以试试,不过还是感谢你这么快就给出了回复,虽然结果不全对,总之,gelivable
      

  9.   

    方法1:
    zero_count 表示需要生成0的个数(列如60%, 那一开始就是60);
    total_count表示还需要生成几个数(一开始就是100);
    在zero_count/total_count 的概率内生产0,否则生成1;每生成一个0, zero_count--;每生成一个数total_count--;
    方法2:
    给数组n(n%)个赋值0,其他随机赋值0或1,遍历数组,随机交换两个数, 也就是把数组打散。