2016-11-23 12 views
1

Мне нужна помощь для занятий в школе.случайные числа из массива в другой массив с разными правилами вхождения в java

Мне нужно создать массив с 6 случайными числами из следующего массива: montab[] = {1,2,3,4,5,6,7,8,9,10,25,50,75,100} и со следующими правилами:

  1. числа 25,50,75,100 может происходить только один раз в массиве
  2. номер 1 в 10 может происходят только дважды в массиве

Я пробовал первое правило на данный момент, но в редких случаях я все еще получаю число более одного раза.

Вот мой код:

public class Exo7bis { 
public static void main (String[] args){ 
    Random random = new Random(); 
    int montab[] = {1,2,3,4,5,6,7,8,9,10,25,50,75,100}; 
    int[] ar1 = new int[6]; 
    int j = 0, compteur25 = 0, compteur50 = 0, compteur75 = 0, compteur100 = 0; 
     for (int i = 0; i < ar1.length; i++) { 
      ar1[i] = (montab[new Random().nextInt(montab.length)]); 
      if (ar1[i] == 25) { 
       compteur25++; 
       if (compteur25 > 1) { 
        while (ar1[i] == 25) 
         ar1[i] = (montab[new Random().nextInt(montab.length)]); 
       } 
      } 
      if (ar1[i] == 50) { 
       compteur50++; 
       if (compteur50 > 1) { 
        while (ar1[i] == 50) 
         ar1[i] = (montab[new Random().nextInt(montab.length)]); 
       } 
      } 
      if (ar1[i] == 75) { 
       compteur75++; 
       if (compteur75 > 1) { 
        while (ar1[i] == 75) 
         ar1[i] = (montab[new Random().nextInt(montab.length)]); 
       } 
      } 
      if (ar1[i] == 100) { 
       compteur100++; 
       if (compteur100 > 1) { 
        while (ar1[i] == 100) 
         ar1[i] = (montab[new Random().nextInt(montab.length)]); 
       } 
      } 
     } 

     for (int i = 0; i < ar1.length; i++) { 
      System.out.print(ar1[i] +" ⎢ " + "\t"); 
     } 
    } 
} 

Я знаю, что мои тесты не полностью правильно, я определил эту проблему, но я не могу найти правильное решение.

Если кто-то может мне помочь или посоветуйте, это будет круто.

Заранее благодарен!

Джереми

ответ

0

Есть много способов для достижения этой цели, но так как вы только с помощью массивов я советую вам сделать функцию, которая подсчитывает, сколько раз 1-10 повторяются. Для первого условия вы можете просто заменить элемент 0, чтобы он не повторил в следующий раз. Я думаю, что это легко объяснить в коде так что посмотрим на то, что вы могли бы изменить в своем коде:

public static void main(String[] args) { 
     Random random = new Random(); 
     int montab[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 25, 50, 75, 100 }; 
     int[] ar1 = new int[6]; 
     int j = 0, count = 0; 
     while (j < ar1.length) { 
      count = 0; 
      int index = random.nextInt(montab.length); 
      int num = montab[index]; 
      if (num >= 25) { //adds any number greater or equal to 25 
       ar1[j] = num; 
       j++; 
       montab[index] = 0; // replace the origianl array with 0. 
      } else if (num != 0) { 
       if(!isRepeated(ar1,num)){ //checks if the array has more than two of the number. 
       ar1[j] = num; 
       j++; 
       } 
      } 
     } 
     for (int i = 0; i < ar1.length; i++) { 
      System.out.print(ar1[i] + " ⎢ " + "\t"); 
     } 
    } 

    public static boolean isRepeated(int[] arr, int num) { //method that verifies if the array has a number repeated twice or not. 
     int count = 0; 
     for (int i = 0; i < arr.length; i++) { 
      if (arr[i] == num) 
       count++; 
     } 
     return count==2 ? true : false; 
    } 

Я не проверял, но я уверен, что он будет работать !!

+0

Привет, Спасибо за ваш ответ. Я не думал о том, чтобы поставить 0 раз больше, чем 25. У меня есть два небольших вопроса, первый из которых посвящен количеству переменных в главном коде. Это необходимо или мы можем удалить его. Это кажется бесполезным, поскольку мы не используем его позже в главном коде. Мой второй вопрос касается вашего метода, так как я новичок в java и для кодирования вообще я полностью понимаю это. У меня проблемы с вашей последней строкой: return count == 2? true: false; Не могли бы вы прокомментировать эту линию для меня, пожалуйста? Спасибо! – Jeremy

+0

@Jeremy Нет, переменная count здесь не нужна, я поставил ее, потому что не был уверен, хотите ли вы '25,75,100' только один раз или каждый из них один раз. Вы можете удалить его там не нужно, и последнее утверждение в методе проверяет условие, если count == 2, затем он возвращает true else, возвращает false. Он называется тернарным оператором 'result = testCondition? value1: value2' –

0

Существует на самом деле простое решение, хотя это не гарантирует действительно случайных чисел.

Что мы будем делать, это создать массив с номерами 1-10, перечисленными дважды, и 25 - 100, перечисленными один раз. Каждый раз, когда выбирается номер, мы заменяем его на 0.

Таким образом, невозможно выбрать более 25 или более двух 8-ти.

В коде

public class Exo7bis { 

    public static void main (String[] args){ 

     Random random = new Random(); 

     int[] intPool = {1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,25,50,75,100}; 
     int[] chosen = {0,0,0,0,0,0}; 

     int counter = 0; 

     // while the list is not full 
     while (chosen[5] == 0) { 

      // generate a number from 0 - 23 (representing the numbers in intPool) 
      int temp = random.randInt(24); 

      // if that element in intPool = 0, it means that it's already chosen 
      // and can't be chosen again. 
      if (intPool[temp] != 0) { 
       chosen[counter] = intPool[temp]; 
       intPool[temp] = 0; 

       counter++; 
      } 
     } 
    } 
} 
0

Вот мой подход. Я пытаюсь изменить исходный список/массив, чтобы исходные номера уменьшались в размере, если они используются в соответствии с правилами.

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 
import java.util.Random; 

public class Exo7bis { 
    private static final List<Integer> montab = new ArrayList<Integer>(Arrays.asList(new Integer[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 25, 50, 75, 100 })); 
    private static final List<Integer> allowOnce = new ArrayList<Integer>(Arrays.asList(new Integer[] { 25, 50, 75, 100 })); 
    private static final List<Integer> allowTwice = new ArrayList<Integer>(Arrays.asList(new Integer[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 })); 
    public static void main(String[] args) { 
     int[] ar1 = new int[6]; 
     for (int i = 0; i < ar1.length; ++i) { 
      int index = new Random().nextInt(montab.size()); 
      int value = montab.get(index); 
      ar1[i] = value; 
      if (isOneOff(value)) { 
       montab.remove(index); 
      } else if (isTwoOff(value)) 
       montab.remove(index); 
     } 
     System.out.println(Arrays.toString(ar1)); 
    } 
    public static boolean isOneOff(final int n) { 
     for (int i = 0; i < allowOnce.size(); ++i) 
      if (allowOnce.get(i) == n) 
       return true; 
     return false; 
    } 
    public static boolean isTwoOff(final int n) { 
     boolean one = false, two = false; 
     for (int i = 0; i < allowTwice.size(); ++i) { 
      int j = 0; 
      for (; j < montab.size(); ++j) { 
       if (montab.get(j) == n) { 
        one = true; 
        break; 
       } 
      } 
      ++j; 
      for (; j < montab.size(); ++j) { 
       if (montab.get(j) == n) { 
        two = true; 
        break; 
       } 
      } 
     } 
     return (one && two); 
    } 
} 
0

Вот решение, которое включает только массивы и дает случайность, которую вы хотите. Идея состоит в том, чтобы хранить вхождения выбранных значений в другом массиве int [] и сравнивать их с вашими ограничениями.[FULL КОД НА ДНЕ]

Объяснение

Линия

if ((randomNum < 25 && newOccurence == 2) || randomNum >= 25) 

проверяет ваши максимальные вхождений.

Затем вы воссоздаете исходный массив (montab) без значения, которое достигло своего предела.

int[] tempTab = new int[montab.length - 1]; 
int skips = 0; 
for (int j = 0; j < tempTab.length; j++) { 
    if (montab[j] == randomNum) { 
     skips++; 
    } 
    tempTab[j] = montab[j + skips]; 
} 
montab = tempTab; 

Этот подход, очевидно, работает, если в исходном массиве нет повторяющихся значений. Производительность может быть не лучшей из-за воссоздания массива, но, по крайней мере, вы избегаете случайности, возможно, повторяя одни и те же значения снова и снова.

Испытано код

import java.util.Random; 

public class Exo7bis { 

    public static void main (String[] args){ 

     int[] montab = {1,2,3,4,5,6,7,8,9,10,25,50,75,100}; 
     int[] ar1 = new int[6]; 
     int[] occurences = new int[montab.length]; 

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

      int randomIndex = new Random().nextInt(montab.length); 
      int randomNum = montab[randomIndex]; 
      int newOccurence = (occurences[randomIndex] = occurences[randomIndex] + 1); 

      /* UNCOMMENT THIS FOR VISUAL STEPS 
      for (int a : montab) { System.out.print(a + " | "); } 
      System.out.println(""); 
      */ 

      if ((randomNum < 25 && newOccurence == 2) || randomNum >= 25) 
      { 
       int[] tempTab = new int[montab.length - 1]; 
       int skips = 0; 
       for (int j = 0; j < tempTab.length; j++) { 
        if (montab[j] == randomNum) { 
         skips++; 
        } 

        tempTab[j] = montab[j + skips]; 
       } 
       montab = tempTab; 
      } 
      ar1[i] = randomNum; 
     } 

     for (int i = 0; i < ar1.length; i++) { 
      System.out.print(ar1[i] +" |" + "\t"); 
     } 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^