我有一种方法,它使用随机样本来近似计算。这种方法被称为数百万次,因此非常重要的是选择随机数的过程必须高效。
我不确定java到底有多快Random().nextInt
,但是我的程序似乎并没有像我期望的那样受益。
选择随机数时,我将执行以下操作(半伪代码):
// Repeat this 300000 times
Set set = new Set();
while(set.length != 5)
set.add(randomNumber(MIN,MAX));
现在,这显然具有最坏的最坏情况下的运行时间,因为理论上随机函数可以为永恒添加重复的数字,从而永远停留在while循环中。但是,数字是从{0..45}中选择的,因此重复的值在大多数情况下是不可能的。
当我使用上述方法时,其速度仅比我的其他方法快40%,该方法虽然不近似,但可以得出正确的结果。这个过程运行了大约一百万次,因此我期望这种新方法至少快50%。
您对更快的方法有什么建议吗?或者,也许您知道一种生成一组随机数的更有效方法。
为了澄清,这是两种方法:
// Run through all combinations (1 million). This takes 5 seconds
for(int c1 = 0; c1 < deck.length; c1++){
for(int c2 = c1+1; c2 < deck.length; c2++){
for(int c3 = c2+1; c3 < deck.length; c3++){
for(int c4 = c3+1; c4 < deck.length; c4++){
for(int c5 = c4+1; c5 < deck.length; c5++){
enumeration(hands, cards, deck, c1, c2, c3, c4, c5);
}
}
}
}
}
// Approximate (300000 combinations). This takes 3 seconds
Random rand = new Random();
HashSet<Integer> set = new HashSet<Integer>();
int[] numbers = new int[5];
while(enumerations < 300000){
set.clear();
while(set.size() != 5){
set.add(rand.nextInt(deck.length));
}
Iterator<Integer> i = set.iterator();
int n = 0;
while(i.hasNext()){
numbers[n] = i.next();
n++;
}
经过一些测试和分析,我发现这种方法是最有效的:
Random rand = new Random();
int[] numbers = new int[5];
ArrayList<Integer> list = new ArrayList<Integer>();
while(enumerations < 300000){
while(list.size() != 5) {
int i = rand.nextInt(deck.length);
if(!list.contains(i)) list.add(i);
}
int index = 0;
for(int i : list){ numbers[index] = i; index++; }
enumeration(hands, cards, deck,numbers);
}
您可以尝试将现有的Java实现(或该实现)用于 Mersenne
Twister
。
请记住,大多数MT 都不是 加密安全的。
问题内容: 我有以下代码从PHP 数组中选取元素: 给定一个大数组,但只有几个元素(例如out ),这相对较慢,因此我想对其进行优化,以使并非所有元素都必须改组。这些值必须是唯一的。 我正在寻找性能最好的替代产品。我们可以假设它没有重复项并且被索引了。 问题答案: 这将提供5个元素,而且没有重复项,而且很快。密钥将被保留。 注意:您必须确保$ array包含5个或更多的元素,或者添加某种检查以防止
问题内容: 我知道这个问题有很多种,但是我还没有找到与我的效率问题相关的答案。 我有下面的代码工作正常。 我有一个10个项目的数组,可以从中随机选择一个项目(按Enter键)。该代码保留了不能随机选择的5个最近选择的数组(以避免随着时间的推移而重复过多)。 如果chooseName()函数最初选择了最近5次使用的名称,它只会中断并再次调用自身,重复直到找到“唯一”名称。 我有两个问题: 说这是“递
问题 你想从一个序列中随机抽取若干元素,或者想生成几个随机数。 解决方案 random 模块有大量的函数用来产生随机数和随机选择元素。 比如,要想从一个序列中随机的抽取一个元素,可以使用 random.choice() : >>> import random >>> values = [1, 2, 3, 4, 5, 6] >>> random.choice(values) 2 >>> random
问题内容: 有没有一种方法可以随机选择一个功能? 例: 上面的代码似乎执行所有3个功能,而不仅仅是随机选择的一个。正确的方法是什么? 问题答案: Python函数是一流的对象:您可以按名称引用它们,而无需调用它们,然后在以后调用它们。 在您的原始代码中,您要调用这三个代码,然后在结果中随机选择。在这里,我们随机选择一个函数,然后调用它。
假设我们有一个枚举类型。 一般来说,并非的所有值都是的有效值,因为我们可以选择它们之间的关系。是否有一种通用的方法来创建E的随机、有效(在定义中命名,不可分配)值?例如,这将不起作用: 因为: 值范围不能从0开始 值范围不能以std::numeric\U limits::max()结束 值范围可能根本不是范围-我们可以从uE中为E选择离散值,例如{1,3,64,272} 鉴于所有枚举值在编译时都是
问题内容: 我不知道我只是在错误的地方还是在什么地方找东西,但是活动记录是否具有检索随机对象的方法? 就像是? 或者…好吧,因为这种方法不存在,所以有一些惊人的“ Rails Way”来做到这一点,我似乎总是很冗长。我也使用mysql。 问题答案: 在Rails 4中,我将扩展: 这样,您可以使用范围: