相关疑难解决方法(0)

如何解决慢Java`SecureRandom`?

如果你想在Java中使用加密强大的随机数,你可以使用SecureRandom.不幸的是,SecureRandom可能会很慢.如果它/dev/random在Linux上使用,它可以阻止等待足够的熵建立.你如何避免性能损失?

有没有人使用Uncommon Maths作为解决这个问题的方法?

任何人都可以确认JDK 6中已经解决了这个性能问题吗?

java security random performance entropy

157
推荐指数
11
解决办法
14万
查看次数

如何创建一个包含20个随机字节的数组?

如何在Java中创建一个包含20个随机字节的数组?

java arrays random

118
推荐指数
4
解决办法
9万
查看次数

找到第n个排列而不计算其他排列

给定表示置换原子的N个元素的数组,是否有类似的算法:

function getNthPermutation( $atoms, $permutation_index, $size )
Run Code Online (Sandbox Code Playgroud)

其中$atoms是元素数组,$permutation_index是置换的索引,是置换$size的大小.

例如:

$atoms = array( 'A', 'B', 'C' );
// getting third permutation of 2 elements
$perm = getNthPermutation( $atoms, 3, 2 );

echo implode( ', ', $perm )."\n";
Run Code Online (Sandbox Code Playgroud)

会打印:

B, A
Run Code Online (Sandbox Code Playgroud)

没有计算每个排列直到$ permutation_index?

我听说过关于事实排列的一些事情,但我发现的每一个实现都会给出一个具有相同V大小的排列,这不是我的情况.

谢谢.

php algorithm math permutation

39
推荐指数
5
解决办法
2万
查看次数

费舍尔·耶茨能否打乱所有扑克牌排列?

我正在使用标准的Fisher-Yates算法来随机洗牌数组中的一副纸牌。但是,我不确定这是否会真正产生现实世界中经过洗牌的纸牌的所有可能排列的真实分布。

V8 Math.random仅具有128位内部状态。由于套牌中有52张卡,因此52个阶乘将需要226位内部状态才能生成所有可能的排列。

但是,我不确定在使用Fisher-Yates时是否适用,因为您实际上并没有生成每种可能的结果,而只是随机地从52个位置中得到一个位置。

function shuffle(array) {
  var m = array.length, t, i;

  while (m) {
    i = Math.floor(Math.random() * m--);
    t = array[m];
    array[m] = array[i];
    array[i] = t;
  }

  return array;
}
Run Code Online (Sandbox Code Playgroud)

javascript arrays random shuffle

10
推荐指数
1
解决办法
170
查看次数

How to get sufficient entropy for shuffling cards in Java?

I'm working on a statistics project involving cards and shuffling, and I've run across an issue with random number generation.

简单算一下,有 52 个!可能的牌组排列,大约为 2^226。我相信这意味着我需要一个至少具有 226 位熵的随机数生成器,甚至可能更多(我不确定这个概念,所以任何帮助都会很棒)。

通过 google 快速搜索,Math.random()Java 中的生成器最多具有 48 位熵,这意味着绝大多数可能的牌组组合都不会被表示。所以这似乎不是 Java 中应该走的路。

我已链接到生成器,但它还没有 java 实现。另外,这里还有我的一种洗牌算法(它使用 Fisher-Yates 方法),以提供一些背景信息。如果您有任何提高代码效率的建议,那也很棒。

public void shuffle(int type, int swaps){
    int[] newDeck = getNewDeck();

    if(type == 1){
        for(int i = 0; i < 52; i++){
            int nextCardIndex = (int)(Math.random()*newDeck.length);
            deck[i] = newDeck[nextCardIndex];
            newDeck = removeItem(nextCardIndex, newDeck);
        }
    }
}

public int[] …
Run Code Online (Sandbox Code Playgroud)

java random random-seed

4
推荐指数
1
解决办法
782
查看次数