批处理脚本,需要帮助生成六个不同数字(1 到 39 之间)的行,与任何前一行的公共数字不超过 2 个

2023-12-10

批处理脚本,需要帮助生成六个不同数字的行,与任何前一行的公共数字不超过 2 个

目标是生成一个 csv 文件,其中包含 300 组 6 个介于 1 到 39 之间的随机数,每组 6 个位于单独的行上,并且每行最多有两个数字与任何前一行相同(两个数字与任何一个数字)之前所有行的行)。这就是目标。我遇到了困难。我希望有人能看到更简单的方法。

我制作的脚本(拼凑在一起)生成一个列表文件,在行中没有重复,但行本身变得越来越长,而不是在 6 处切断。我还需要检查所有先前行以确保最大行数的部分两个重复项。如果有人有解决方法(真诚的解决方法),我非常感谢任何可以帮助更快实现目标的人。

这是到目前为止的脚本:


@echo off
setlocal enabledelayedexpansion 

for /L %%j in (1 1 10) do (
    call:get_rand
    echo %%j  ;!NUM[1]!;!NUM[2]!;!NUM[3]!;!NUM[4]!;!NUM[5]!;!NUM[6]! >> test.txt

    sort "get_six.txt" >> "get_sort.txt"
    for /f %%b in (get_sort.txt) do findstr "%%~b" "get_tmp.txt" >nul 2>&1 || echo %%b>>"get_tmp.txt"
    call:get_horiz
rem call:del_get_files
)
goto:EOF


rem delete extra files:
rem :del_get_files
rem for %%z in (get_six.txt,get_sort.txt,get_tmp.txt) do (
rem     if exist "%%z" del /q /f "%%z"
rem )
rem goto:EOF


rem get_tmp.txt vertical list to csv horizontal list.txt
:get_horiz
set var=
for /f "tokens=*" %%c in (get_tmp.txt) do (
    call set var=%%var%%,%%c
)
SET var=%var:~1%
echo !var! >> list.txt
goto:EOF


rem get first set of six random numbers
:get_rand
for /L %%i in (1 1 6) do (
    call:get_n %%i
    rem get random number, 1 is the min, 39 is the max
    echo !num[%%i]! >> get_six.txt
)
goto:EOF


rem get random num[%%i] between 1 and 39
:get_n
set /a num[%1] = %RANDOM% * 39 / 32768 + 1
goto:EOF

=========

list.txt (expected):

03,11,17,24,28,37
11,13,25,26,36,39
02,09,15,23,28,37
03,13,14,26,28,32
08,11,21,22,34,36
02,13,16,26,27,31
01,06,14,20,27,31
07,09,20,23,33,34
...

条件1:每行没有重复的数字

条件 2:与任何其他行匹配的数字不超过两个

(我只目视检查过这些,我可能错过了一些,但是,例如,第四行“03,13,14,26,28,32”与第一行“03, 11,17,24,28,37”,以及 13 和 26 以及第二个“11,13,25,26,36,39”——没关系,在允许的最大值内)

list.txt (current):

10,28,39 
10,28,39,14,20,22,36 
10,28,39,14,20,22,36,25,34,35 
10,28,39,14,20,22,36,25,34,35,18,31,32 
10,28,39,14,20,22,36,25,34,35,18,31,32,19,29,7 
10,28,39,14,20,22,36,25,34,35,18,31,32,19,29,7,11,17,21,23,33 
10,28,39,14,20,22,36,25,34,35,18,31,32,19,29,7,11,17,21,23,33,12,37 
10,28,39,14,20,22,36,25,34,35,18,31,32,19,29,7,11,17,21,23,33,12,37,24 
10,28,39,14,20,22,36,25,34,35,18,31,32,19,29,7,11,17,21,23,33,12,37,24,15 
10,28,39,14,20,22,36,25,34,35,18,31,32,19,29,7,11,17,21,23,33,12,37,24,15,27

:/


@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION

:: remove variables starting #
FOR  /F "delims==" %%e In ('set # 2^>Nul') DO SET "%%e="

SET #combos=0

:newcombo
SET /a #nums=0
:: remove variables starting $
FOR  /F "delims==" %%e In ('set $ 2^>Nul') DO SET "%%e="
:newrnd
SET /a nextrand=%RANDOM%
IF %nextrand% gtr 32759 GOTO newrnd
SET /a nextrand=101+(nextrand%%39)
IF DEFINED $%nextrand% GOTO newrnd
SET "$%nextrand%=%nextrand:~-2%"
SET /a #nums+=1
IF %#nums% lss 6 GOTO newrnd
SET "#c="
FOR  /F "tokens=2delims==" %%e In ('set $ 2^>Nul') DO SET "#c=!#c!,%%e"
FOR /L %%y IN (1,1,%#combos%) DO (
 SET /a matchcount=0
 FOR %%o IN (!#c%%y!) DO IF DEFINED $1%%o set/a matchcount+=1
 IF !matchcount! gtr 2 GOTO newcombo
)
SET /a #combos+=1

ECHO %#combos% generated

SET "#c%#combos%=%#c:~1%"
IF %#combos% lss 300 GOTO newcombo
(
 FOR /L %%y IN (1,1,%#combos%) DO ECHO !#c%%y!
)>u:\combos.txt

TYPE u:\combos.txt

GOTO :EOF

嗯——它不会打破任何速度记录。至少要通宵跑步。

将新的随机数设置为nextrand。检查它是否不 >32759,因为超过此值会使处理的随机数产生偏差(在任何情况下都不是线性的)

计算 101+(随机 mod 39) -> 101..139

if $selection设置后,则该号码已被选择,因此请重新选择。否则,设置$selection to 01..39.

重复直到我们选择了 6 个数字

Build #c从 $values 中选择的值,这些值将按排序顺序(特征set) 并在每个之前插入逗号,所以#c可能会成为,05,07,12,17,22,31例如

对于已记录的每个组合,计算与当前 6 个组合的匹配数$1xx所选择的值。如果找到超过 2 个,则寻找另一个组合。否则,记录新的组合并计数,直到达到限制。

但是——确实很慢……

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

批处理脚本,需要帮助生成六个不同数字(1 到 39 之间)的行,与任何前一行的公共数字不超过 2 个 的相关文章

  • 如何按高度对 DIV 进行排序?

    我有三个divs 我想按高度从最大到最小对它们进行排序 div smallest div div largest div div middle div 任何想法 这很简单 使用 sort http www wrichards com blo
  • Windows 批处理:如何添加主机条目?

    我想使用此批处理脚本通过使用自动将新条目添加到我的主机文件中windows questions tagged windows batch 不幸的是 剧本只需在主机文件中添加一行 当我以管理员身份运行脚本时 又出了什么问题 echo off
  • 从列表中删除重复元素

    我开发了一个数组列表 ArrayList
  • 使用多个小数点 (.) 对 Oracle 中的记录进行排序

    UPDATE 甲骨文版本10G 我有一个记录列表Oracle如下 这些其实是各种书籍的章节记录按以下格式生成 主主题 子主题 第一级部分 最后级部分 Sections 1 7 1 6 2 7 1 7 4 6 8 3 6 8 2 10 1 1
  • Pandas MultiIndex 按分类顺序自定义排序级别,而不是按字母顺序

    我是 Pandas 0 16 1 的新手 并且希望在多索引中进行自定义排序 因此我使用分类 我的多重索引的一部分 Part Defect Own 504 504 504 505 506 507 530 530 530 我创建了具有多索引级别
  • 按字母顺序对集合进行排序

    有什么方法可以开箱即用地按字母顺序对集合进行排序 使用 C 2 0 Thanks 我们正在谈论什么样的收藏 AList
  • 批处理:在特定程序中打开特定文件?

    当记事本是 txt 文件的默认程序时 如何告诉 Windows 在写字板中打开 C test test txt 接受的答案对我不起作用 我不确定这是因为我试图运行的程序 还是因为路径中有空格 即使我用引号引起来 或者其他原因 不管怎样 我可
  • 在 python 中使用 numpy.linalg.eig 后对特征值和关联的特征向量进行排序

    我使用 numpy linalg eig 来获取特征值和特征向量的列表 A someMatrixArray from numpy linalg import eig as eigenValuesAndVectors solution eig
  • 使用 Google Guava 进行不区分大小写的排序

    目前 我在两个不同的地方使用以下两段代码来创建一个排序的 不可变的列表 return Ordering natural immutableSortedCopy iterable and return Ordering usingToStri
  • 从 Windows 批处理文件中检测 ANSI 兼容控制台?

    Windows 10 控制台主机 conhost exe has 对 ANSI 转义序列的本机支持 https msdn microsoft com en us library windows desktop mt638032 aspx 旧
  • 如何使用 Windows 命令行环境查找和替换文件中的文本?

    我正在使用 Windows 命令行环境编写批处理文件脚本 并希望用另一个文件 例如 BAR 更改文件中某些文本 例如 FOO 的每次出现 最简单的方法是什么 有内置函数吗 这里的很多答案都帮助我指明了正确的方向 但是没有一个适合我 所以我发
  • 与 data.table 合并时防止重复列

    我有两个数据表 它们的列名部分相似 dfA lt read table text A B C D E F G iso year matchcode 1 0 1 1 1 0 1 0 NLD 2010 NLD2010 2 1 0 0 0 1 0
  • 批处理 - 默认浏览器?

    有没有办法使用批处理文件查找我的计算机上的默认浏览器 只需使用 启动 www google com See here http social msdn microsoft com Forums is iewebdevelopment thr
  • 对数据框的行进行排序

    我有以下数据框 adjusted RFC df Node Feature Indicator Scaled Class Direction True False 0 0 km lt 0 181 class 4 0 gt 1 NA 125 1
  • 午夜后时间设置不正确

    我使用以下命令以更易读的格式获取当前日期 时间 set day date 4 2 set mth date 7 2 set yr date 10 4 set hur time 0 2 set min time 3 2 set bdate d
  • 搜索/排序算法 - 是否有类似 GoF 的列表?

    我是一名自学成才的开发人员 坦率地说 我不太擅长找出在任何特定情况下使用哪种搜索或排序算法 我只是想知道是否有设计模式 esque 列出了以太坊中可用的常见算法 供我添加书签 就像是 算法名称 带有别名 如果有的话 它解决的问题 大O成本
  • C 中的菱形数组排序

    我有以下 C 语言作业 我基本上需要一种方法而不是解决方案 我们有一个 13 x 13 的数组 在数组中 我们有一个需要考虑的菱形形状 该菱形之外的所有内容都初始化为 1 不重要 下面的 5 x 5 数组示例 x x 1 x x x 2 2
  • 从Oracle表中删除重复行

    我正在 Oracle 中测试某些内容并使用一些示例数据填充表 但在此过程中我不小心加载了重复记录 因此现在我无法使用某些列创建主键 如何删除所有重复行并只保留其中一行 Use the rowid伪列 DELETE FROM your tab
  • 为什么 Windows 批处理文件“exit”不能与“||”一起使用?

    批处理 命令脚本中的通常建议是使用exit b设置时退出ERRORLEVEL来指示错误 然而这与 CMD 的配合不太好 and 运营商 如果我在 CMD 命令行运行这些 C gt echo exit b 1 gt foo cmd C gt
  • 使用 firebase 按最新消息对聊天列表进行排序

    我不知道为什么我陷入了一个问题chatList不按最后一条消息时间或最新消息排序 我尝试过存储timestamp在数据库中和订单子依据时间戳 但它仍然不起作用 不起作用意味着列表不会在每条消息后排序 并继续将列表显示为在第一条消息后排序 看

随机推荐