如果你想在Java中使用加密强大的随机数,你可以使用SecureRandom
.不幸的是,SecureRandom
可能会很慢.如果它/dev/random
在Linux上使用,它可以阻止等待足够的熵建立.你如何避免性能损失?
有没有人使用Uncommon Maths作为解决这个问题的方法?
任何人都可以确认JDK 6中已经解决了这个性能问题吗?
给定表示置换原子的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大小的排列,这不是我的情况.
谢谢.
我正在使用标准的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) 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) random ×4
java ×3
arrays ×2
algorithm ×1
entropy ×1
javascript ×1
math ×1
performance ×1
permutation ×1
php ×1
random-seed ×1
security ×1
shuffle ×1