【问题标题】:Is it possible to use a String as a seed for an instance Random? [duplicate]是否可以将字符串用作实例 Random 的种子? [复制]
【发布时间】:2014-07-21 19:29:26
【问题描述】:

我有一个字符串值,我想使用字符串作为种子初始化一个随机类?

是否有可能做到这一点,如果可以,怎么做?

字符串不仅包含 ASCII。我可以有任何 utf-8 符号。

【问题讨论】:

  • 简单地说,你不能。随机是一个数字。您必须将字符串转换为数字 (long),首先将该数字用作 Random 的种子 - 如果字符串包含数字或可转换...供您参考:developer.android.com/reference/java/util/Random.html
  • 你可以在它上面运行一个 CRC32,得到的整数就是你的种子。developer.android.com/reference/java/util/zip/CRC32.html
  • 或者,如果您的字符串仅包含 a-z 和 0*9 个字符(即:去掉英文句子中的所有标点符号和所有空格),您也可以从 base 36 进行转换
  • @JeroenVannevel 但如果我的字符串不是英文的?如果有 10 个字符的 utf-8 字符串。它是 20 字节或 160 位。它有 2^160 个变体。不会太久?
  • CRC32 无论如何都会返回一个 long(它只是一个纠错码):developer.android.com/reference/java/util/zip/CRC32.html

标签: java android


【解决方案1】:

可以使用String.hashCode的实现,区别在于使用long而不是int

static long stringToSeed(String s) {
    if (s == null) {
        return 0;
    }
    long hash = 0;
    for (char c : s.toCharArray()) {
        hash = 31L*hash + c;
    }
    return hash;
}

这样你会得到一个long,但当然有不同的Strings 可以产生相同的种子。根据您用作输入的Strings,某些种子的出现概率可能高于其他种子。

【讨论】:

    【解决方案2】:

    您可以使用 ascii 值或 utf-8 符号做一些事情,将它们全部写成数字,然后将它们加在一起。或者,如果需要,您可以选择更高级的“散列函数”,例如参见以下维基百科页面:http://en.wikipedia.org/wiki/List_of_hash_functions

    【讨论】:

      猜你喜欢
      • 2021-04-15
      • 2017-01-08
      • 2021-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-14
      • 1970-01-01
      相关资源
      最近更新 更多