从一个原始整数列表生成打乱整数列表的算法

2024-03-13

有一个 ArrayList 为x unique Integers,我需要将它们随机分配y数组列表z尺寸。请记住:

  • x y z是变量值。
  • 结果数组中的数字不能重复。
  • 结果列表不能包含相同的数字! (订购它们必须不同)
  • 如果计算结果数组中的出现次数,则原始数组中每个数字的使用次数必须尽可能与其他数字相同。
  • 必须使用原数组中的所有数字,不能使用任何数字 它们不能不被使用。
  • 如果可能的话,必须在 Java 7 中工作。不是 100% 强制,但是...
  • 所得组合将用于类似于彩票的用途,因此它们不能太连续并且必须非常随机。它们还将按从最小到最大的顺序排列。
  • 最初,我尝试生成所有可能的组合,目的是获得所需的数量,但这是不可行的,因为如果您选择高值,例如 11 的组合中的 40 个数字,则有数百万个数字,并且 CPU 会卡在计算很长时间,所以我尝试开发一种更简单的算法,而不计算所有组合(我在下面发布代码)。

一个示例是这样的,当您有一个包含 8 个元素的数组的原点并且想要输出 3 个大小为 6 的数组时:

原始数组列表:[1,2,3,4,5,6,7,8]

结果输出: [7, 5, 3, 6, 4, 8], [7, 5, 1, 8, 2, 3], [8, 1, 2, 3, 4, 6]

我开发了一种算法,在评论中进行了解释。首先,我创建了一个包含总位置的数组,并计算每个数字必须重复多少次才能填充输出数组。然后我用重复必要次数的每个数字填充数组,如果数组未满(因为当我除以得到placesByNumber我四舍五入为整数)我用原始数字集中的随机数填充它。之后,我对数字进行洗牌,最后,我填充结果数组,并记住我不能在每个结果数组中重复数字。

问题就在这里,有时,我遇到最后一个数组没有完全填满的情况,因为洗牌的最后一个数字numbersGroup变量包含在最后一个数组中。

这是一个失败的例子:

原始数组列表:[1,2,3,4,5,6,7,8]

打乱一组数字以填充结果数组:

[8、2、4、4、5、7、2、3、8、2、1、5、7、1、6、3、6、1]

结果数组:(第三个没有 6 个元素,因为 6 和 1 是 包含在其中)

[[8,2,4,5,7,3],[4,2,8,1,5,7],[2,1,6,3]]

我发现了一些非常丑陋的方法来解决它,但效率非常低,我正在尝试找到一种更好、更有效的算法来实现这一目标。

这是我的源代码:

public static List<List<Integer>> getOptimizedCombinations(List<Integer> numbers, int numbersPerCombination, int desiredCombinations){
    List<List<Integer>> result = new ArrayList<>();
    
    //calculate total places and how many places correspond to each number.
    int totalPlaces = numbersPerCombination * desiredCombinations;
    int placesByNumber = totalPlaces / numbers.size();
    
    //instantiating array with the total number of places
    Integer[] numbersGroup = new Integer[totalPlaces];
    
    //filling the array with the numbers, now we know how many times a number must be inside the array, 
    //so we put the numbers. First we do it in order, later we will shuffle the array.
    int pos = 0;
    for (int n : numbers) {
        for (int i=0; i<placesByNumber; i++) {
            numbersGroup[pos] = n;
            pos++;
        }
    }
    
    //if there are places for fill, we fill it with random numbers. This can be possible because when we divide the total places between the 
    //numbers size, it can give a decimal as a result, and we round it to lower binary number without decimals, so it is possible to
    //have non filled places.       
    if (pos<totalPlaces) {
        while(pos<totalPlaces) {                
            numbersGroup[pos] = numbers.get(getRandom(0, numbers.size()));
            pos++;              
        }
    }       
    
    shuffleArray(numbersGroup);
    
    //we instantiate the arraylists
    for (int i=0; i<desiredCombinations; i++) {
        result.add(new ArrayList<Integer>());
    }
                    
    //filling the arraylists with the suffled numbers
    for (int i=0; i<numbersGroup.length; i++) {
        for (int j=0; j<result.size(); j++) {
            //if the combination doesn't have the number and the combination is not full, we add the number
            if (!result.get(j).contains(numbersGroup[i]) && result.get(j).size()<numbersPerCombination) {
                result.get(j).add(numbersGroup[i]);
                break;
            }
        }
    }
    
    return result;
}

static void shuffleArray(Integer[] ar){
    Random rnd = new Random();
    for (int i = ar.length - 1; i > 0; i--)
    {
        int index = rnd.nextInt(i + 1);
        // Simple swap
        int a = ar[index];
        ar[index] = ar[i];
        ar[i] = a;
    }
}

public static int getRandom(int min, int max) {
    return (int)(Math.random() * max + min);
}

这就是这样的:

    ArrayList<Integer> numbers = new ArrayList<Integer>() {{ 
        add(1); 
        add(2);
        add(3); 
        add(4); 
        add(5); 
        add(6); 
        add(7);
        add(8);
    }};
    getOptimizedCombinations(numbers, 6, 3);

您可以使用Streams 将打乱列表限制为z要素:

List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8);

List<List<Integer>> result = new LinkedList<>();
for(int i = 0; i < y; i++) {
  Collections.shuffle(numbers);
  List<Integer> list = numbers.stream().limit(z).collect(Collectors.toList());
  result.add(list);
}

System.out.println(result);

也许可以用更优雅的方式完成,但输出应该是这样的:

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

从一个原始整数列表生成打乱整数列表的算法 的相关文章

  • URL.setURLStreamHandlerFactory

    我正在使用带有嵌入式 Jetty 的可执行 jar 开发一个 Web 应用程序 我的jar包含一个依赖jar jar in jar 我参考了JarRsrcLoader and RsrcURLStreamHandlerFactory由 Ecl
  • 哪个 Swing 布局管理器可以获得我想要的布局?

    我正在尝试按照这个模型制作一个基本的登录菜单 我决定将整个菜单放入 JPanel 中 以便在连接成功后我可以切换到另一个面板 所以我决定使用 Borderlayout 将标题放在北区 将连接按钮放在南区 我将边框布局的中心本身设置为面板 我
  • 正则表达式获取字符串中的第一个数字和其他字符

    我是正则表达式的新手 想知道如何才能只获取字符串中的第一个数字 例如100 2011 10 20 14 28 55 在这种情况下 我希望它返回100 但该数字也可以更短或更长 我在想类似的事情 0 9 但它单独获取每个数字 100 2001
  • 字符串池可以包含两个具有相同值的字符串吗? [复制]

    这个问题在这里已经有答案了 字符串池可以包含两个具有相同值的字符串吗 String str abc String str1 new String abc Will the second statement with new operator
  • 容器中的 JVM 计算处理器错误?

    最近我又做了一些研究 偶然发现了这一点 在向 OpenJDK 团队抱怨之前 我想看看是否有其他人观察到这一点 或者不同意我的结论 因此 众所周知 JVM 长期以来忽略了应用于 cgroup 的内存限制 众所周知 现在从 Java 8 更新某
  • Java-如何将黑白图像加载到二进制中?

    我在 FSE 模式下使用 Java 和 swing 我想将完全黑白图像加载为二进制格式 最好是二维数组 并将其用于基于掩码的每像素碰撞检测 我什至不知道从哪里开始 过去一个小时我一直在研究 但没有找到任何相关的东西 只需将其读入Buffer
  • 所有平台上的java

    如果您想用 java 为 Windows Mac 和 Linux 编写桌面应用程序 那么所有这些代码都相同吗 您只需更改 GUI 即可使 Windows 应用程序更像 Windows 等等 如果不深入细节 它是如何工作的 Java 的卖点之
  • Jenkins 的代码覆盖率 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 当您在数组列表上调用remove(object o)时,它如何比较对象?

    当您在 java 中的数组列表上调用remove object o 时 它如何比较对象以找到要删除的正确对象 它使用指针吗 或者它使用 Comparable 接口来比较对象吗 ArrayList remove 依赖于对象的实现Equal方法
  • 带有 OpenId 提供程序的 Java Spring 安全性

    我有一个 spring MVC 应用程序 另一个客户端应用程序想要使用 open id connect 访问我的 spring 应用程序 如何在服务器端实现开放ID提供商 请帮忙 MITREid 连接 OpenID Connect Java
  • 每个术语出现的次数

    我得到了一个数组a n 2 where n can be 10 5最大时有n个科目和n个学生 全部编号为 1 2 n a i 0 and a i 1 1 lt i lt n 表示在第 i 个科目中 所有来自a i 0 to a i 1 通过
  • 访问或解析 R 中的 summary() 中的元素

    我运行以下 R 命令来进行 Dunnett 测试并获取摘要 如何访问下面线性假设的每一行 这是摘要输出的一部分 基本上我不知道摘要的结构 我尝试使用名称 但它似乎不起作用 因为我没有看到任何命名属性来提供这一点 library multco
  • Excel:#CALC!使用 MAP 函数计算间隔重叠时出现错误(嵌套数组)

    我正在努力解决以下公式 它适用于某些情况 但不适用于所有情况 名字input有失败的数据集 得到一个 CALC 描述 嵌套数组 错误 LET input N1 0 0 N1 0 10 N1 10 20 names INDEX input 1
  • Hibernate HQL:将对值作为 IN 子句中的参数传递

    我面临一个问题 如何使用 IN 子句将查询中的成对值的参数传递给 HQL 例如 select id name from ABC where id reg date in x y 并且参数是不同的数据类型string id 和reg date
  • 了解 Spark 中的 DAG

    问题是我有以下 DAG 我认为当需要洗牌时 火花将工作划分为不同的阶段 考虑阶段 0 和阶段 1 有些操作不需要洗牌 那么为什么 Spark 将它们分成不同的阶段呢 我认为跨分区的实际数据移动应该发生在第 2 阶段 因为这里我们需要cogr
  • 使用 secp256r1 曲线和 SHA256 算法生成 ECDSA 签名 - BouncyCastle

    我正在尝试使用带有 secp256r1 曲线 P256 的 ECDSA 和用于消息哈希的 SHA256 算法生成签名 我也在使用 Bouncy Castle 库 下面的代码 public class MyTest param args pu
  • Java:由 HTTP 连接创建的等待连接线程存活时间很长

    我有一个服务器端代码 用于检查 SOAP 服务是否已启动 代码如下 String response while response length 0 try final URL url new URL DummySoapServiceURL
  • 公共方法与公共 API

    在干净的代码书中 有一个观点是 公共 API 中的 Javadocs 同样 Effective java 一书也有这样的内容 项目 56 为所有公开的 API 元素编写文档注释 所以这就是我的问题 所有公共方法都被视为公共 API 吗 它们
  • 为什么应该首选 Java 类的接口?

    PMD https pmd github io 将举报以下违规行为 ArrayList list new ArrayList 违规行为是 避免使用 ArrayList 等实现类型 而是使用接口 以下行将纠正违规行为 List list ne
  • 使用随机放置的 NaN 创建示例 numpy 数组

    出于测试目的 我想创建一个M by Nnumpy 数组与c随机放置的 NaN import numpy as np M 10 N 5 c 15 A np random randn M N A mask np nan 我在创建时遇到问题mas

随机推荐

  • Ajax JSON 转为 Highcharts 饼图

    在过去的几天里 我在外部文件中的一些示例 json 数据中使用 ajax 来使用 Highcharts 库填充饼图时遇到了问题 这是文件中的示例 JSON 数据 data json Apples 43 0 Pears 57 0 这是我的 h
  • R闪亮-启用键盘快捷键?

    有没有办法暴露键盘按键 如功能键 F1 F10 来控制闪亮 例如切换标签 我能够想出一个半工作的解决方案 但是闪亮确实有一些限制 所以我用闪亮打开了一个错误 这是代码 library shiny jscode lt function doc
  • 有谁知道如何实现 C++ 项目属性规则的 DynamicEnumProperty 类型

    我正在尝试向 C 项目的自定义构建配置添加一个属性 我希望属性组合框显示可以在代码中设置的动态值列表 我认为这应该使用 DynamicEnumProperty 类型来完成 但我不确定它的实现 在此之前有人与此房产合作过可以为我指明正确的方向
  • 由用户在 C# 类中使用的 WPF 传递传入变量

    我的目标是在文件 user xaml 在文本框中 中传输用户传入的变量 并在类中返回该变量
  • SVN不递归更新

    几周前 我检查了我们的整个 SVN 存储库 non recursive模式 现在看来 当我做一个svn up 它不会递归更新文件夹 这是一个问题 因为我想从同事那里获取更改 而不必遍历每个目录并执行svn up手动 如何强制更新是递归的 以
  • 我什么时候应该使用“REQUIRED”和“NOT_SUPPORTED”作为 MDB 的 @TransactionAttribute 值?

    我了解容器管理事务 CMT 我也知道关于不同的可能值 http docs oracle com javaee 6 api javax ejb TransactionAttributeType html枚举类型的TransactionAttr
  • DI 在桌面应用程序中有意义吗?

    我即将创建一个桌面应用程序 使用 NET Windows 窗体 本质上 我想创建一个 n 层应用程序 但我也希望各层之间松散耦合 但是 我不太确定这对于 Windows 窗体来说是否是一个好方法 现在我只是想知道使用任何 IoC Struc
  • 如何停用 Spring Data 异常转换

    The new org springframework orm hibernate5 HibernateExceptionTranslator使用失败是指它首先尝试使用普通 Hibernate 来映射异常 SessionFactoryUti
  • 如何更新 vueJs 数组列表的特定行?

    有没有一种正确的方法可以刷新 vueJS 数组列表中的某一特定行而不重新加载所有数据 在本例中 它是一个电话列表
  • 为什么 AngularJS $http success/error 方法被弃用?从 v1.6 中删除?

    AngularJS 文档有一个弃用通知 http success and error方法 这个抽象被从库中删除有什么具体原因吗 问题是 success and error方法是不可链接因为他们忽略返回值 这给熟悉的人带来了问题chainin
  • 表单以 windows-1252 编码提交

    I am getting the following warning in the JS tab of the Firefox web console Ctrl Shift K 表单以 windows 1252 编码提交 无法编码 所有 U
  • 带选项的 Python 装饰器

    我有一个模块 它的函数原型与线程类的原型类似 def do fn argtuple kwargdict priority 0 block False timeout 0 callback None daemon False do stuff
  • 如何正确编写异步方法?

    所以我试图学习在 C 中使用 async 和 await 的基础知识 但我不确定我在这里做错了什么 我期待以下输出 Calling DoDownload DoDownload done output here 但我没有得到下载的输出 我也期
  • 使用 Ionic 框架生成 PDF 文件

    Ionic 框架是否有任何插件可以使用 html 内容生成 pdf 文件 基本上 我需要使用从 Ionic 移动应用程序传递的值和一些 css 样式创建一个 html 然后将其转换为 pdf 文件 该文件可以保存在设备 Android 设备
  • 多人游戏同步

    我实现了服务器 客户端架构 其中所有状态更改都发送到函数 经过验证并广播到所有连接的客户端 这工作得相当好 但系统目前无法维持游戏客户端实例之间的同步 如果服务器和特定客户端之间恰好有 5 秒的延迟 那么他将在其他客户端之后 5 秒收到状态
  • 在 MATLAB 中从一维数组生成二维数组

    有谁知道是否有一种方法可以从 1D 数组生成 2D 数组 其中 2D 中的行是通过重复 1D 数组中的相应元素生成的 I e 1D array 2D array 1 1 1 1 1 1 2 2 2 2 2 2 3 gt 3 3 3 3 3
  • 是否可以对分块数据使用 DictVectorizer?

    我正在尝试使用 python pandas csv reader 导入分块数据 以克服内存错误 并使用 DicVectorizer 将字符串转换为浮点数据类型 但我可以看到两个不同的字符串在转换后具有相同的代码 我们是否有替代 选项来对分块
  • 如果父节点值匹配,则将相应父节点的所有子节点合并到第一个父节点下

    嗨 我的输入是这样的
  • 如何在 Linq To SQL 中为连接设置 ARITHABORT ON

    默认情况下 对于 OLEDB 连接 SQL 连接选项 ARITHABORT 为 OFF 我假设 Linq To SQL 正在使用该连接 不过我需要它处于开启状态 原因是我的数据库包含一些索引视图 如果连接没有启用 ARITHABORT 则对
  • 从一个原始整数列表生成打乱整数列表的算法

    有一个 ArrayList 为x unique Integers 我需要将它们随机分配y数组列表z尺寸 请记住 x y z是变量值 结果数组中的数字不能重复 结果列表不能包含相同的数字 订购它们必须不同 如果计算结果数组中的出现次数 则原始