Catchy title。我试图编写一个excel宏来以一种看似随机的方式对工作表中的单元格进行洗牌,但是以后它可以在以后进行不洗。然而,这里的关键特征是改组是由输入键决定的,在我提出的解决方案中这是一个数字,反向/非反洗操作也依赖于这个键。
我目前的做法如下:如果您不想阅读详细信息,我将在下面总结
我在纸张上的单元格中输入了一个数字。我把这个数字转换成非理性的东西(在我目前的方法中它被转换为PI() - 或者至少是正确的密钥,但是另一个无理数字就可以了。)
现在,我的shuffling数组中的每个单元格都根据其位置分配了一个唯一的整数值。此唯一编号与密钥组合,以提供取决于密钥的一些独特结果。例如=MID(PI()/10,3, UniqueValue)
- 记住PI()是由密钥生成的,因此取决于密钥的值。
因此,对于数组A1:A3
,其唯一值只是{1,2,3}
,那么它们的唯一结果将是{1,14,141}
。这些仍然是按升序排列的,因此为了给出随机传播,我=COS(A1:A3)
或更具体地=COS(MOD(A1:A3,2*PI()))
来计算Excel中COS范围之外的数字。这给了我一些很好的混合输出值。
最后,我将输出值与彼此排列,以给出一个新的唯一整数列表。这些新值表示数组中的新位置。 A1:A3
的计算步骤从{1,2,3}到{0.5403 ...,0.13674 ..., - 0.93172}到{1,2,3}。这里没有随机化,但是对于13个数字:从{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}
到{0.5403… , 0.13674… , -0.93172… , 0.28355… , -0.98753… , 0.91345… , -0.72052… , 0.99538… , -0.6825… , 0.80817… , -0.15975… , 0.38126… , 0.99859}
到{5, 8, 12, 7, 13, 3, 11, 2, 10, 4, 9, 6, 1}
。这在输入和输出之间具有良好的低相关性。这里唯一的问题是PI()只存储到16ish dp,这意味着=MID(PI()/10,3, UniqueValue)
最多可以运行13个单元格。因此,我需要一些计算PI()的n位的方法,我可能必须使用插口算法。
然后去洗牌,只需转到每个单元格,找出已发送单元格内容的位置,然后将该位置的值复制回原始单元格
长话短说,细胞根据其位置具有独特的价值。为其分配一个新的唯一值,该值是其原始值和单独的用户输入键的乘积,并且设计为不与原始值相关联。新值决定了工作表上的新位置。
如上所述,我目前的随机化方法需要知道比Excel更多的PI()数字。但请记住,我不只是使用PI()作为常量,它是由我的输入决定的变量(可能通过输入值的acos()获得PI()的倍数 - 所以我可以'我只需要获得一个百万位Pi的文本文档,我需要能够计算许多变量所需的dps - 我只选择Pi作为正确的密钥,因为可以使用套管算法生成PI的后续数字。
但随机化可能很容易改善。我的问题是实现:是否正确地为每个单元格生成一个新数字?或者是否有一种更简单的方法来改变我忽略的纸张?我的方法需要很多临时复制值:如果我想将数组洗牌但将其保留在工作表上的相同位置,我需要保护单元格不被复制,因为新单元格会移动到它们的位置。