使用特定字符串生成 1 到 10 之间的两个随机数
Generate two random numbers between 1 to 10 using specific string
我想根据提供的字符串实现一个逻辑,我必须生成两个介于 1 到 10 之间的随机数。
我有一个像 Johnsen 这样的字符串,使用它我必须生成两个数字,如 1 和 3,下次使用相同的字符串时,它应该为相同的字符串提供相同的数字.
需要帮助来开发此算法或逻辑。
您可以获得字符串的哈希码,然后用它来为随机数生成器提供种子。使用 RNG 获取 1 - 10 范围内的数字。
Java 通过 java.util.Random
class 支持随机数生成器。这 class 'works' 通过有一个种子值,然后根据这个种子值给你一些随机数据,然后将种子值更新为新的东西。
这实际上意味着:
- 2 个具有相同种子值的 j.u.Random 实例将产生相同的值序列,如果您对其调用相同的调用序列以提供随机数据。
- 但是,种子值的类型是
long
- 64 位数据。
- 因此,要执行您想要的操作,您需要编写一个算法,将任何字符串转换为
long
。
- 鉴于那么长,您只需使用
new Random(seedValue)
构造函数创建一个 j.u.Random
的实例作为种子。
这样就剩下了:如何将字符串变成长字符串?
简单的方法
最简单的答案是对它们调用 hashCode()
。但是,请注意,哈希码只有 32 位信息(它们是 int
,而不是 long
),因此这并未涵盖所有可能的种子值。除非您出于加密目的这样做,否则这不太重要。如果你是,那么你需要停止你正在做的事情并做更多的研究,因为它非常容易搞砸并且拥有看起来测试良好但很容易破解的工作代码。你不想要那个。对于初学者,您可能需要 SecureRandom
,但这只是冰山一角。
更难的方法
存在将任意数据转换为固定大小的哈希表示的哈希算法。字符串 [A] 的 hashCode 算法只生成 32 位的哈希值,而 [B] 不是加密安全的:如果你让我生成一个字符串来散列为提供的值,我可以轻松地做到;一个密码安全的散列具有 属性,我不能只为你编写一个散列为所需值的字符串。
您可以在网络上搜索散列字符串或字节数组(您可以使用 str.getBytes(StandardCharsets.UTF_8)
将一个字符串转换为一个字符串)。
您可以 'collapse' 将包含散列的字节数组转换为 long 也很容易 - 只需取该散列中的任意 8 个字节并使用它们构造 long。 “把8个字节变成一个长”如果你在网上搜索的话也有很多教程。
不过,我认为简单的方法足以完成此练习。
因此:
String key = ...;
Random rnd = new Random(key.hashCode());
int number1 = rnd.nextInt(10) + 1;
int number2 = rnd.nextInt(10) + 1;
System.out.println("First number: " + number1);
System.out.println("Second number: " + number2);
我想根据提供的字符串实现一个逻辑,我必须生成两个介于 1 到 10 之间的随机数。
我有一个像 Johnsen 这样的字符串,使用它我必须生成两个数字,如 1 和 3,下次使用相同的字符串时,它应该为相同的字符串提供相同的数字.
需要帮助来开发此算法或逻辑。
您可以获得字符串的哈希码,然后用它来为随机数生成器提供种子。使用 RNG 获取 1 - 10 范围内的数字。
Java 通过 java.util.Random
class 支持随机数生成器。这 class 'works' 通过有一个种子值,然后根据这个种子值给你一些随机数据,然后将种子值更新为新的东西。
这实际上意味着:
- 2 个具有相同种子值的 j.u.Random 实例将产生相同的值序列,如果您对其调用相同的调用序列以提供随机数据。
- 但是,种子值的类型是
long
- 64 位数据。 - 因此,要执行您想要的操作,您需要编写一个算法,将任何字符串转换为
long
。 - 鉴于那么长,您只需使用
new Random(seedValue)
构造函数创建一个j.u.Random
的实例作为种子。
这样就剩下了:如何将字符串变成长字符串?
简单的方法
最简单的答案是对它们调用 hashCode()
。但是,请注意,哈希码只有 32 位信息(它们是 int
,而不是 long
),因此这并未涵盖所有可能的种子值。除非您出于加密目的这样做,否则这不太重要。如果你是,那么你需要停止你正在做的事情并做更多的研究,因为它非常容易搞砸并且拥有看起来测试良好但很容易破解的工作代码。你不想要那个。对于初学者,您可能需要 SecureRandom
,但这只是冰山一角。
更难的方法
存在将任意数据转换为固定大小的哈希表示的哈希算法。字符串 [A] 的 hashCode 算法只生成 32 位的哈希值,而 [B] 不是加密安全的:如果你让我生成一个字符串来散列为提供的值,我可以轻松地做到;一个密码安全的散列具有 属性,我不能只为你编写一个散列为所需值的字符串。
您可以在网络上搜索散列字符串或字节数组(您可以使用 str.getBytes(StandardCharsets.UTF_8)
将一个字符串转换为一个字符串)。
您可以 'collapse' 将包含散列的字节数组转换为 long 也很容易 - 只需取该散列中的任意 8 个字节并使用它们构造 long。 “把8个字节变成一个长”如果你在网上搜索的话也有很多教程。
不过,我认为简单的方法足以完成此练习。
因此:
String key = ...;
Random rnd = new Random(key.hashCode());
int number1 = rnd.nextInt(10) + 1;
int number2 = rnd.nextInt(10) + 1;
System.out.println("First number: " + number1);
System.out.println("Second number: " + number2);