【问题标题】:How can I generate random numbers where each digit lies within a number range?如何生成每个数字都在一个数字范围内的随机数?
【发布时间】:2016-12-03 01:45:06
【问题描述】:

我试图弄清楚如何在数组中生成和存储 10 个随机数,其中数字是两位数,每个数字在 0-7 的范围内。比如10、23、35、77都可以,1、78、89、99不行。而且,我想确保所有数字都是唯一的。到目前为止,这是我想出的...

import java.util.Random;
public class RandomNum{
      public static void main(String[] args){
            Random rand=new Random();
            int[] randomFirstDigit=new int[10];
             int[] randomSecondDigit=new int[10];

             for(int i=0;i<10;i++){
                 randomFirstDigit[i]=rand.nextInt(7-1+1)+1;
             }
             for(int i=0;i<10;i++){
                 randomSecondDigit[i]=rand.nextInt(7-1+1)+0;
             }
             int[] randomArr=new int[10];
             for(int i=0;i<10;i++){
             randomArr[i]=(randomFirstDigit[i]*10)+randomSecondDigit[i];
             }
             for(int i=0;i<=randomArr.length;i++){
                 System.out.println(randomArr[i]);
             }
      }
}

上述代码的主要问题是,有时数组值不是唯一的。换句话说,两个相同的数字存储在像 23,23 这样的数组中。

谁能帮我解决问题。

提前感谢您的帮助。

【问题讨论】:

  • 问题是这不是C++。标记已删除。
  • 我假设这些反对票来自阅读标题但没有阅读问题详细信息的人。这个问题不仅仅是“生成一个随机数”。我会建议一个经过编辑的标题。

标签: java random unique


【解决方案1】:

所以可能的数字列表是[10, 11, 12, ..., 17, 20, ..., 76, 77],它的大小是7 * 8。我们需要 10 个不同的随机数来表示该列表中的索引,然后我们可以使用 i -&gt; (i / 8 + 1) * 10 + (i % 8) 将它们映射到实际数字。

这是一个使用ThreadLocalRandom.ints 的非常简单的解决方案:

int[] array = ThreadLocalRandom.current()
        .ints(0, 7 * 8)
        .distinct()
        .limit(10)
        .map(i -> (i / 8 + 1) * 10 + (i % 8))
        .toArray();

【讨论】:

  • 一个非常好的现代解决方案。 +1 使用 ThreadLocalRandom 而不是像我一样使用 java.util.Random。
  • 我必须学会使用 Streams。这些功能性解决方案看起来非常棒。
【解决方案2】:

更简单且计算成本更低的解决方案是一次生成每个数字,然后将其附加到字符串。之后可以将其转换为整数。

要准确生成 10 个唯一数字,我们可以将生成的每个数字添加到 HashSet,其中每个元素都必须是唯一的。我们可以继续这样做,直到 HashSet 有 10 个元素。

import java.util.Random;
import java.util.Set;
import java.util.HashSet;

public class TwoDigitGenerator {

    public static void main(String[] args) {

        // Generate 10 unique random numbers with desired properties.
        Set<Integer> usedNumbers = new HashSet<>();
        while (usedNumbers.size() < 10)
            usedNumbers.add(randomNumber());

        // Convert the set of numbers to an Integer array.
        Integer[] numbers = usedNumbers.toArray(new Integer[usedNumbers.size()]);

        for (Integer number : numbers)
            System.out.println(number);
    }

    public static int randomNumber() {
        Random random = new Random();
        String number = "";
        number += 1 + random.nextInt(7); // Generate first digit between 1 and 7 inclusively
        number += random.nextInt(8); // Generate second digit between 0 and 7 inclusively
        return Integer.parseInt(number);
    }

}

【讨论】:

  • 能保证不重复吗?
  • @Jon 是的。我已经解决了这个问题。
【解决方案3】:

请您再次循环该数组并检查它是否已经存在。这不是最好的解决方案,因为某些代码是多余的,但可以为您提供一些有关如何处理它的提示。

import java.util.Random;
public class RandomNum{
      public static void main(String[] args){
            Random rand=new Random();
            int[] randomFirstDigit=new int[10];
             int[] randomSecondDigit=new int[10];

             for(int i=0;i<10;i++){
                int gen = rand.nextInt(7-1+1)+1;
                Boolean flag = false;
                 for(int j=0; j < 10; j++)
                  if(randomFirstDigit[j] == gen) 
                   flag = true
                if(!flag) randomFirstDigit[i] = gen;
             }

             for(int i=0;i<10;i++){
                int gen = rand.nextInt(7-1+1)+0;
                Boolean flag = false;
                 for(int j=0; j < 10; j++)
                  if(randomSecondDigit[j] == gen) 
                   flag = true;
                if(!flag) randomSecondDigit[i] = gen;
             }

             int[] randomArr=new int[10];
             for(int i=0;i<10;i++){
               randomArr[i]=(randomFirstDigit[i]*10)+randomSecondDigit[i];
             }
             for(int i=0;i<=randomArr.length;i++){
                 System.out.println(randomArr[i]);
             }
      }
}

【讨论】:

  • 此代码无法编译。它在第 13 行缺少分号,并在我第一次运行它时抛出了 ArrayIndexOutOfBoundException。它还生成了很多 0,这是不允许的。
猜你喜欢
  • 2018-04-08
  • 2011-05-16
  • 1970-01-01
  • 2011-08-02
  • 1970-01-01
  • 2019-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多