有没有使用数字作为生成随机字符串的算法?

2024-01-30

我想生成一个任意固定长度的随机字符串(N)我的选择。使用相同的数字作为该算法的提要,它应该生成相同的字符串。通过对数字(如数字 + 1)进行较小的更改,它应该生成一个完全不同的字符串。 (很难与前一个种子联系起来)如果多个数字可能产生相同的字符串,那也没关系。有什么方法可以做到这一点吗?

顺便说一句,我想在字符串中显示一组字符,例如 A-Z a-z 0-9。

例如

Algorithm(54893450,4,"ABCDEFG0") -> A0GF
Algorithm(54893451,4,"ABCDEFG0") -> BDCG

我可以将每个字符一一随机,但这需要N每个角色都有不同的种子。如果我想这样做,问题可能会变成“如何生成N来自一个数字的数字”作为种子。

最终目标是我想将 GUID 转换为在印刷媒体上更易读且更短的内容。我不关心冲突。 (如果确实发生了冲突,我仍然可以检查 GUID 来解决)


好的,感谢@Jim Mischel 的指导。我阅读了所有相关页面并对此有了更多了解。

http://blog.mischel.com/2017/05/30/how-not-to-generate-unique-codes/ http://blog.mischel.com/2017/05/30/how-not-to-generate-unique-codes/

http://blog.mischel.com/2017/06/02/a-broken-unique-key-generator/ http://blog.mischel.com/2017/06/02/a-broken-unique-key-generator/

http://blog.mischel.com/2017/06/10/how-did-this-happen/ http://blog.mischel.com/2017/06/10/how-did-this-happen/

http://blog.mischel.com/2017/06/20/how-to-generate-random-looking-keys/ http://blog.mischel.com/2017/06/20/how-to-generate-random-looking-keys/

https://ericlippert.com/2013/11/12/math-from-scratch-part-thirteen-multiplicative-inverses/ https://ericlippert.com/2013/11/12/math-from-scratch-part-thirteen-multiplicative-inverses/

https://ericlippert.com/2013/11/14/a-practical-use-of-multiplicative-inverses/ https://ericlippert.com/2013/11/14/a-practical-use-of-multiplicative-inverses/

https://en.wikipedia.org/wiki/Extended_Euclidean_algorithm https://en.wikipedia.org/wiki/Extended_Euclidean_algorithm

简而言之,首先我应该使用序列号。那是 1,2,3,4,... 非常可预测,但它可能会变成随机且难以猜测的东西。

(请注意,在我的情况下,这并不完全可能,因为每个用户都将在本地生成自己的 ID,因此我无法运行全局序列号,因此我使用 GUID。但我将制定自己的解决方法以使 GUID 适合此解决方案,可能对 GUID 进行简单的取模以使其符合我想要的范围。)

具有连续整数n我可以通过乘法然后取模得到另一个看似无关的整数。这可能看起来像(n * x)% m with x and m我的选择。当然m必须大于我想要使用的最大数字,因为它在乘法时环绕模数。

仅此一点就是一个良好的开端,因为数字接近n不提供类似的输出。但我们对此不能那么确定。例如,如果我的x是 4 并且m是 16 那么输入只能产生 0,4,8,12。为了避免这种情况,我们选择x and m这是彼此的互质。 (最大公约数为 1)有许多明显的候选数,例如 100000m(将我的输出限制定义为 99999)和 2429 作为x。如果我们像这样选择2个互质,不仅可以尽可能减少结果冲突,还可以保证每个输入在该范围内产生唯一的输出。

我们可以从这个例子中学到:

(n * 5) % 16

由于 5 和 16 是互质数,因此我们可以在回绕之前获得唯一数字序列的最大长度。 (长度 = 16)如果我们按顺序输入从 0 到 16 的数字:

Input : 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
Output : 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, 1, 6, 11, 0

我们可以看到输出的顺序不太可预测,而且除了最后一个输出之外,没有一个输出是相同的。它会传送到所有可能的可用号码。

现在,我非常可预测的连续运行数字将产生足够不同的数字,并且只要它在范围内,也保证不会与任何其他输入发生冲突m。剩下的就是通过基数转换将此数字转换为我选择的字符串。如果我有 5 个字符“ABCDE”,那么我将使用 base-5。

仅此对于我的用例就足够了。但是利用乘法逆元的概念我还可以找到另一个整数y它可以将乘法模变换反转为原始数字。目前我还没有完全理解这部分,但它使用扩展欧几里得算法来查找y.

由于我的应用程序不需要恢复,但我暂时不理解它也没关系。我一定会尝试理解那部分。

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

有没有使用数字作为生成随机字符串的算法? 的相关文章

  • 正则表达式 - 从 markdown 字符串中提取所有标题

    我在用灰质 https www npmjs com package gray matter 以便将文件系统中的 MD 文件解析为字符串 解析器产生的结果是这样的字符串 n Clean er ReactJS Code Conditional
  • 在 String.Format 中插入格式化字符?

    我用谷歌搜索了这个 但 VB Net 2008 似乎不允许在 String Format 中插入格式化字符 例如 t r n BAD MessageBox Show String Format 0 tab 1 Foo Bar BAD Mes
  • 如何延迟 onClick 操作

    我正在尝试在 java 应用程序 android 中做一些事情 并且我需要一些东西来延迟 等待循环的秒数 我怎样才能延迟android功能 我尝试过使用 Thread sleep TimeUnit sleep 但它只会执行几秒钟的不负责任的
  • 面试题:三个数组,O(N*N)

    假设我们有three长度数组N其中包含任意数量的类型long 然后我们得到一个数字M 相同类型 我们的任务是选择三个数字A B and C每个数组中的一个 换句话说A should从第一个数组中选取 B从第二个开始和C从第三个 所以总和A
  • Swift 仅删除字符串中的尾随空格

    SO 中的许多示例都固定两侧 即前导和尾随 我的要求只是关于尾随 我的输入文本是 保持我的左侧 期望的输出 保持我的左侧 当然 这个命令会删除两端 let cleansed messageText trimmingCharacters in
  • 随机采样数组的唯一子集

    如果我有一个数组 a 1 2 3 如何随机选择数组的子集 以使每个子集的元素都是唯一的 也就是说 对于a可能的子集是 1 2 3 1 2 2 3 1 2 3 我无法生成所有可能的子集 因为 a 的实际大小非常大 因此有很多很多子集 目前 我
  • 用于查找最近邻居的空间划分算法如何工作?

    为了找到最近的邻居 空间分区 http en wikipedia org wiki Nearest neighbor search Space partitioning是算法之一 它是如何工作的 假设我有一组 2D 点 x 和 y 坐标 并
  • 当满足动态条件时退出递归函数

    使用来自的函数生成汉明距离 t 内的所有比特序列 https stackoverflow com questions 40813022 generate all sequences of bits within hamming distan
  • 调度算法,找到设定长度的所有非重叠区间

    我需要为我的管理应用程序实现一种算法 该算法将告诉我何时可以将任务分配给哪个用户 我实现了一个蛮力解决方案 它似乎有效 但我想知道是否有更有效的方法来做到这一点 为了简单起见 我重写了算法以对数字列表进行操作 而不是数据库查询等 下面我将尝
  • 数组所有可能的组合

    我有一个字符串数组 ted williams golden voice radio 我希望这些关键字的所有可能组合采用以下形式 ted williams golden voice radio ted williams ted golden
  • C 中带有指针的 For 循环

    我不明白指针在其中的作用for loop 什么是 p在下面的循环中做什么 char str 128 Some Text char p for p str p what does this mean p Code 其余的我都明白 但为什么不明
  • 你能用 C# 编写一个同样优雅的排列函数吗?

    我非常喜欢这个 6 行解决方案 并尝试在 C 中复制它 基本上 它会排列数组的元素 def permute xs pre if len xs 0 yield pre for i x in enumerate xs for y in perm
  • 如何在Python字符串中替换括号及其中的文本

    我有两个这样的字符串 string1 Today I went to the market to pick up some fruit string2 Today I went to school to learn algebra and
  • Z 算法背后的直觉

    Z算法是一种复杂度为O n 的字符串匹配算法 一种用例是从字符串 B 中查找字符串 A 的最长出现次数 例如 overdose from stackoverflow 将会 over 您可以通过使用组合字符串调用 Z 算法来发现这一点 ove
  • 按字符分割字符串

    scala 有一个标准的分割字符串的方法StringOps split 但它的行为有点让我惊讶 演示一下 使用快捷便利功能 def sp str String str split toList 以下表达式全部计算结果为 true sp Li
  • 实时战略战争游戏人工智能算法

    我正在设计一款实时策略战争游戏 其中 AI 将负责控制大型六边形地图上的大量单位 可能超过 1000 个 一个单位有许多行动点 可以用于移动 攻击敌方单位或各种特殊行动 例如建造新单位 例如 一辆拥有 5 个行动点的坦克可以花费 3 个行动
  • 随机定位的 div,不重叠

    所有 div 都像我需要的那样 随机 放置 但它们偶尔会重叠 这只是一个机会问题 我怎样才能防止这种情况发生 理想情况下我能够设置它们之间的最小距离 我可以通过进一步开发当前的 javascript 来实现这一目标吗 我需要考虑完全不同的方
  • 解析分隔字符串

    我怎样才能得到 connect 100 username example 从这个字符串 ngg connect gt 100 username gt example Using std string find有参数 and gt and s
  • 查找最接近点的多边形顶点的索引

    Heading 我需要找到最接近点的多边形的索引 所以在这种情况下 输出将是 4 和 0 这样 如果添加了红点 我就知 道将顶点放置在数组中的位置 有谁知道从哪里开始 抱歉 如果标题有误导性 我不知道如何正确表达它 In this case
  • 如何实现n个元素的查找和插入操作的动态二分查找

    这个想法是使用多个数组 每个长度为 2 k 根据 n 的二进制表示来存储 n 个元素 每个数组都是排序的 不同的数组没有以任何方式排序 在上述数据结构中 SEARCH是通过对每个数组进行一系列二分查找来进行的 INSERT 是通过一系列相同

随机推荐