java - 洗牌的随机性

标签 java arraylist random playing-cards

我有一个包含 52 张卡片的卡片数组列表。我想洗牌。

这就是我所做的。

  1. 创建了一个新的数组列表。
  2. 生成 0 到牌组大小之间的随机索引。
  3. 在随机索引中获取卡片并添加到新列表。
  4. 从牌组中取出牌
  5. 重复直到甲板空了。

这是我的代码:

String[] Number = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
String[] Suits = {"Club","Diamonds","Hearts","Spades"};
ArrayList<Card> deck = new ArrayList<Card>();

// create a deck    

for(int i=0;i<13;i++){
        for(int j=0;j<4;j++){
            Card card = new Card(Suits[j],Number[i]);
            deck.add(card);
        }    
    }

// shuffle of deck

ArrayList<Card> new_deck = new ArrayList<Card>();
    while(deck.size()!=0){   

        Random rand = new Random();
        int  n = rand.nextInt(deck.size());

        new_deck.add(deck.get(n));
        deck.remove(n);
    }

// Display

for(int i=0;i<52;i++){
        System.out.println(new_deck.get(i).getSuit()+" : "+new_deck.get(i).getValue());
    }

最后,我从新的 ArrayList 中获得了洗牌后的牌组。

它的随机性够不够好?

我应该怎么做才能增加随机性?

最佳答案

Does it's randomness is enough or not ?

定义足够好 (!!)

您当前的方法将提供良好的洗牌,没有明显的偏差......除了随机数生成器可能引入的偏差。

在这种情况下,确实值得关注。 Random 被指定为线性同余生成器,并且 LC 生成器在生成的数字中具有不同的模式。 (在统计术语中,它们显示出很强的自相关性。)如果您绘制第 n 个随机数与 n 的关系图,这一点就很清楚了。

要提高随机性,您应该使用更好的随机数生成器。 SecureRandom 生成器应该足够好:javadoc .


如果您使用 Collections.shuffle 方法,同样需要考虑随机性。对于好的(或一致的)随机播放,您应该在提供Random 实现的地方使用方法重载...并选择一个好的实现。

关于java - 洗牌的随机性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43691935/

相关文章:

java - (libgdx/scene2d) 使用 Actor 等创建不同的舞台

java - 更多线程 = 每秒请求更少?

java - 如何在不破坏 Maven 发布插件的情况下传递 javac 多个命令行参数,其中一些参数包括冒号?

java - 无向图的邻接表在 Java 中给出了错误的输出

java - TreeSet 如何作为成员变量在 Enum Singleton 中处理

javascript - 限制元素出现在屏幕之外

java - J2ME : How to generate random number?

java - 字符串标记器更改分隔符,不显示它

java - 如何防止连续两次询问相同的乘法数字

java - 每 500 帧从 ArrayList 中删除元素