3

在 java 中使用 random 实用程序时,您会得到一些像这样的数字:1271、34556、177 等... 使数字不重复的最简单方法是什么?

4

6 回答 6

9

您可以打乱数组 [1,2,3,4,5,6,7,8,9] 并将其读取为数字。

如果您不想固定位数或允许非前导零,它会变得更加复杂(如果您关心某种平等分布)。

于 2013-07-15T09:49:35.457 回答
6

List您可以使用数字初始化 a 0-9。然后随机化该列表并从该列表中轮询随机数量的元素(1 到 9 之间)。连接数字,您的号码与非重复数字。

于 2013-07-15T09:50:41.890 回答
3

如何创建一个循环来检查生成的随机数是否满足您的要求。

final Random rnd = new Random();
int n;
do {
    n = rnd.nextInt(1000);
} while(containsRepeatingDigits(n));

containsRepeatingDigits看起来像这样:

boolean containsRepeatingDigits(final int n) {
    final boolean digits[] = new boolean[10];
    for(char c : String.valueOf(n).toCharArray()) {
        final int i = c-'0';
        if(digits[i])
            return true;
        digits[i] = true;
    }
    return false;
}
于 2013-07-15T09:59:29.937 回答
1

您可以检查随机数是否有重复数字,如果有,则生成一个新数字。它是用 C# 编写的,但您应该能够很容易地将其转换为 Java。

    private static Random rand = new Random();
    public static int GenerateNumberNonRepeat()
    {
        int number;
        do
        {
            number = rand.Next();
        } while (IsRepeating(number));

        return number;
    }

    public static bool IsRepeating(int number)
    {
        string textual = number.ToString();
        for (int i = 0; i < textual.Length; i++)
        {
            for (int j = i + 1; j < textual.Length; j++)
            {
                if (textual[i] == textual[j])
                    return true;
            }
        }

        return false;
    }
于 2013-07-15T09:55:35.100 回答
0

生成这些数字的另一种方法是生成任意数字,如果它包含重复数字,则生成一个新数字,或者删除重复数字(例如,增加数字直到没有更多重复数字)。

与提议的 shuffle/select 方法相比,这具有优势,即您可以(或多或少地)保留原始 rng 的分布。

于 2013-07-15T09:57:40.423 回答
0

此代码可以帮助您

    Set set  = new HashSet<Integer>();
    Random rand= new Random();
    public int getNonRepeatingRandomNumber() {
        int intV = rand.nextInt();
        if(set.contains(intV)) {
            return getNonRepeatingRandomNumber();
        }
        else {
            set.add(intV);
            return intV;
        }
    }
于 2013-07-15T09:59:40.147 回答