重新排序号码

时间:2010-12-12 02:42:17

标签: math permutation shuffle random

我的数字在1-62范围内 我希望能够“隐藏”它们,因此很难猜测它们是按某种顺序生成的。

所以,它应该是一些映射,例如

1→35 2→19 3→61 ...

这样我就有1比1的映射,100%可逆。


我可以硬编码映射,但我更喜欢数学解决方案,某种公式以数字作为参数,并产生1-62范围内的数字,并且不产生重复。这个公式有可能存在吗?


仅用于历史,验证脚本:

<?
  $test = array();

  $val = 37;
  for($i=0;$i<62;$i++)
  {
    if($test[($i*$val)%62])
    {
      print("Collision: $i ".$test[($i*$val)%62]."<br/>");
    }
    $test[($i*$val)%62] = $i;
    print("$i => ".(($i*$val)%62)."<br/>");
  }

?>

更新

以下是由于这些答案而生成的ID:

qpOLHk
NMb84H
aI740D
x5urn0
UsROKn
hPeb7K
EcByu7
1zYVRu
oWlieR
LjIFBe
8G52YB
v3splY
SqPMIl
fNc95I
Cazws5
ZxWTPs
mUjgcP
JhGDzc
6E30Wz

Sweeeeeet: - )

4 个答案:

答案 0 :(得分:3)

您可以将数字1到62放在一个数组中并随机播放该数组(例如使用Fisher-Yates shuffle)。然后将数组的索引映射到该单元格的内容(但如果使用0索引数组,请注意一个错误的错误。)

为了使其成为确定性,请使用随机数生成器的特定种子。

编辑:计算成本较低(也更容易猜测)的映射是乘以某个常数然后计算结果模62:

result = (input * 37) % 62

37号只是一个例子。你可以使用任何coprime到62的数字 - 除31之外的任何奇数。

答案 1 :(得分:1)

按照马克拜尔斯的评论。找到x mod n的倒数(例如,n = 62)。

x成为区间[1, n]中的输入整数。使用extended Euclidean algorithm查找yt以查找xy + nt = 1 mod n。然后是y = x^{-1} mod n

答案 2 :(得分:1)

答案 3 :(得分:0)

使用RSA。这很容易实现(好吧,取决于语言),这里是worked example