【问题标题】:Is there an easy way to rearrange a number in java? [closed]有没有一种简单的方法可以在java中重新排列数字? [关闭]
【发布时间】:2011-08-29 04:14:22
【问题描述】:

基本上我想取一个随机数说:

73524896

我想给我们相同的号码,但随机重新排列如下:

46932857

有没有办法在java中轻松做到这一点?

【问题讨论】:

  • 对不起,这只是一个例子。我会解决的。
  • 为什么他们在这个问题上的票数非常接近?
  • 这是针对项目欧拉问题吗?
  • 为什么这不是一个真正的问题?

标签: java arrays integer


【解决方案1】:

这是我最喜欢的解决方案。 (请注意,所有改组的可能性都相同。)

Random rnd = new Random();
int rndInt = rnd.nextInt(10000000);

String[] rndChars = ("" + rndInt).split("(?<=.)");
Collections.shuffle(Arrays.asList(rndChars));
String result = "";
for (String s : rndChars) result += s;
int shuffled = Integer.parseInt(result);

// Print original and shuffled
System.out.println(rndInt);
System.out.println(shuffled);

示例输出:

4769797
9497767

【讨论】:

  • 我的答案,但有代码,而且速度更快。双加好!
  • 我已经用链接回答了,你提供了代码:)
  • 也可以使用 Collections.shuffle(Arrays.asList(chars));而不是 for 循环。
  • Collections.shuffle( ) 仅适用于对象,不适用于原始类型。 leepoint.net/notes-java/algorithms/random/random-shuffling.html
  • 哼,不是吗?假设rnd.nextInt返回一个均匀随机数,每个元素new pos应该是均匀分布的,不是吗?
【解决方案2】:

Collections.shuffle() 接受一个列表并返回一个列表,其中有一个toArray()Arrays.asList() 接受一个数组并返回一个列表。 String 有一个 toCharArray() 和一个接受 char 数组的构造函数。整数有toString()valueOf()

【讨论】:

  • 不完整(Arrays.asList 不适用于 char[]。)您需要一个库函数(例如 commons-collections 或 guava,或者自己滚动)来做到这一点
  • 坚果。你是对的,当然。我想你也可以使用 "\\d" 而不是获取 char 数组进行拆分。不过,这不是很有效......然后我必须有一个不存在的 String.join() 。
【解决方案3】:
//generate random number
String number = "73524896";

//put each digit in an element of a list
List<Character> numberList = new ArrayList<Character>();
for (char c : number.toCharArray()){
  numberList.add(c);
}

//shuffle
Collections.shuffle(numberList);

//output
String shuffledNumber = "";
for (Character c : numberList){
  shuffledNumber += c;
}
System.out.println(shuffledNumber);

【讨论】:

    【解决方案4】:

    这将对您有所帮助:Random Numbers - shuffling

    不是完整的代码,只是链接中的一个sn-p

    Random rgen = new Random();  // Random number generator
    int[] cards = new int[52];  
    
    //--- Initialize the array to the ints 0-51
    for (int i=0; i<cards.length; i++) {
        cards[i] = i;
    }
    
    //--- Shuffle by exchanging each element randomly
    for (int i=0; i<cards.length; i++) {
        int randomPosition = rgen.nextInt(cards.length);
        int temp = cards[i];
        cards[i] = cards[randomPosition];
        cards[randomPosition] = temp;
    }
    

    【讨论】:

    • 是的,这很好用!谢谢。我可以在 7 分钟内接受。
    • 如上,随机但不是完全随机的随机播放。
    • @Neil:请解释一下你的意思?您在评论之前访问过链接吗?
    • 我不需要访问链接,我知道一个简单的反例。如果有 3 件事情要洗牌,那么就有 6 次洗牌,但您的循环会随机生成 27 个排列。因此,您不能随机生成 6 次随机播放。
    • @Neil,多么棒的解释。你是想出来的还是从某个地方听说的?
    【解决方案5】:

    (1) 将数字转换为字符串

    (2) 使用标准的shuffling algorithm 打乱字符

    (3) 转换回数字

    【讨论】:

      【解决方案6】:

      我想说最简单的方法是将整数解析为字符串,重新排列字符串中的数字,然后将其解析回整数。

      public int rearrange(int num){
        StringBuilder asStr = new StringBuilder(num + ""); //convert to string
      
        inplaceShuffle(asStr);
      
      
        return Integer.parseInt(asStr.toString());
      
      }
      

      【讨论】:

        【解决方案7】:

        转成字符串,得到字符数组,然后随机化字符数组,再转回字符串。

        这会让你随机化任何字符串,而不仅仅是数字。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-08
          • 1970-01-01
          • 2016-07-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多