有效地选择随机数

2024-01-02

我有一个方法,它使用随机样本来近似计算。该方法被调用数百万次,因此选择随机数的过程是否高效非常重要。

我不确定java有多快Random().nextInt确实如此,但我的程序似乎并没有像我希望的那样受益。

选择随机数时,我执行以下操作(以半伪代码):

// Repeat this 300000 times
Set set = new Set();
while(set.length != 5)
    set.add(randomNumber(MIN,MAX));

现在,这显然有一个糟糕的最坏情况运行时间,因为理论上的随机函数可以永远添加重复的数字,从而永远停留在 while 循环中。但是,这些数字是从 {0..45} 中选择的,因此大多数情况下不太可能出现重复的值。

当我使用上述方法时,它只比我的其他方法快 40%,这不是近似值,但产生了正确的结果。该程序运行了约 100 万次,因此我预计这种新方法至少会快 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 实现 http://www-stat.stanford.edu/~naras/programs/#mt (或者这个 http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/VERSIONS/JAVA/MTRandom.java) for a 梅森扭转者 http://en.wikipedia.org/wiki/Mersenne_twister.

请记住,大多数 MT 都是not加密安全。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有效地选择随机数 的相关文章

随机推荐

  • 在 Angular v2 中处理 Google Charts 中的选择事件

    我正在使用 Angular v2 2 0 0 beta 1 并使用 Google Charts 显示一个简单的图表 import Component View from angular2 core import Http HTTP PROV
  • 如何验证 C 宏中的类型

    我一直在考虑验证 C 宏中类型的方法 到目前为止我想出的最好方法是 define ASSERT PTYPE TYPE VALUE 0 int TYPE 0 VALUE 显然 这需要一个类型名称和一个指向该类型的指针 也可以制作类似的 ASS
  • 无法使用 PHP 的 SimpleXML 将命名空间添加到属性

    我正在创建一个 Atom feed 当我尝试在下面添加时xmlns i作为属性 node gt addAttribute xmlns i http www w3 org 2001 XMLSchema instance 我得到这个作为输出 i
  • 无法解析符号“FirebaseInstanceId”

    我正在尝试使用 FirebaseInstanceId 但不断收到错误 无法解析符号 FirebaseInstanceId gradle 模块包括 dependencies compile com google firebase fireba
  • Spring Boot JPA 插入和更新

    好吧 我环顾四周寻找这个答案大约一个小时 但我看不到它发布 所以我在 Udemy 上购买了 in28 分钟的 Spring 框架大师班 我们已经开始实施 JPA 但是 Spring Boot版本不同 他使用2 0 3 我使用2 4 0 现在
  • Java 中的多行工具提示?

    我正在尝试在 Java 中显示工具提示 它可能是也可能不是段落长度 如何对长工具提示进行自动换行 如果将工具提示包裹在 and 标签 你可以用以下方式换行 br 标签 看https web archive org web 200606250
  • Magento 2 SQLSTATE[HY000]:一般错误:1823 无法添加外键约束

    大家好 我的 Magento 2 商店出现错误 例如 API 请求失败 Swagger 给出 500 样式表和 JS 文件无法加载等 最后我找到了使用新主题文件创建新 Magento 安装并复制的最佳解决方案pub media从文件中并进入
  • 如何将每个联系人的短信数量获取到文本视图中?

    我有一个listview显示我设备上的联系人 我想要做的是将我的设备从每个联系人收到的短信数量显示到列表视图中的文本视图中 我只能显示total我的收件箱中来自此代码的短信数量 gets total count of messages in
  • CUDA Direct3D 互操作性已弃用?

    我一直在查看 CUDA 文档 并且直接 3D 11 互操作性 http docs nvidia com cuda cuda driver api group CUDA D3D11 DEPRECATED html group CUDA D3D
  • on(release) {...} 或 Button.on Release = function() {...} - actionscript 2 问题

    我对我正在创建的一些 Flash 横幅感到非常困惑 并将按钮制作成可打开网页的可点击对象 我在下面使用这段代码已经有一段时间了 它有效 on release getURL http www the dude co uk blank 我将此代
  • AS3 - 如何找到对象相对于舞台的位置?

    如果舞台上有一个矩形 如何找到其相对于舞台的左上角 x y 和右下角 x y 奇怪的是我怎么在谷歌上找不到这个 localToGlobal point of DisplayObject将点对象从显示对象的 局部 坐标转换为舞台 全局 坐标
  • 当向 Excel 提供来自 win32com 的数据时出现命名冲突 (_FilterDatabase)

    我想创建一个快速脚本 从标准化表单 word 文档 docx 中提取数据并将其传输到 Excel 工作表中 并附上一张进行一些计算的工作表 一切都运行得很好 除了一个例外 我希望能够过滤特定项目编号 用户首字母或其他数据点的结果 但是当我在
  • 泛型 的实际含义是什么? [复制]

    这个问题在这里已经有答案了 可能的重复 List gt 在 java 泛型中意味着什么 https stackoverflow com questions 1844770 what does list mean in java generi
  • 如何获取公开共享文件/文件夹的链接

    我们可以使用共享文件 文件夹https developers google com drive v2 reference permissions insert https developers google com drive v2 ref
  • 批处理脚本移动带时间戳的文件

    所以基本上我有一个文件系统 C Test BaseLine 在BaseLine文件夹下有很多文件夹 可能是1个文件夹 也可能是15个文件夹 这些文件夹中都是图像文件 我想将这些文件夹中不包括 BaseLine 文件夹的所有图像复制到另一个位
  • GO:未知标志-trimpath

    这是我第一次接触GO hello go My first GOlang program package main import fmt func main fmt Printf Hello World n 我收到此错误 command li
  • 如何添加“活动”类以与 Angular 2 链接

    我有一页包含部分和固定菜单 当用户单击菜单项时 页面将滚动到相应的部分 对于滚动我使用https github com Nolanus ng2 page scroll https github com Nolanus ng2 page sc
  • 如何确定使用 Spring Security 访问 URL 需要哪些角色?

    我正在使用 Spring Security 来保护网络应用程序 URL 的安全性如下
  • Java中如何将Integer[]数组转换为int[]数组?

    有没有一种奇特的方法将 Integer 数组转换为 int 数组 我不想迭代每个元素 我正在寻找一种优雅而快速的方式来编写它 相反 我正在使用 scaleTests add Arrays stream data boxed toArray
  • 有效地选择随机数

    我有一个方法 它使用随机样本来近似计算 该方法被调用数百万次 因此选择随机数的过程是否高效非常重要 我不确定java有多快Random nextInt确实如此 但我的程序似乎并没有像我希望的那样受益 选择随机数时 我执行以下操作 以半伪代码