人工智能
如何让Python和C++生成相同的随机数
00 分钟
2024-5-13
2024-6-21
type
status
date
slug
summary
tags
category
icon
password
URL-TEXT
😀
人工智能的推理场景下,需要对比c++以及python的运行结果,但是全1或者全0并不适配所有情况。本文介绍一种让两者生成相同随机数的方法。
 

📝 如何让Python和C++生成相同的随机数

方法论

在相同的种子(seed)情况下,使用 NumPy 和 C++ 的随机数生成器通常无法直接得到相同的随机数序列。这是因为不同的编程环境和库通常使用不同的算法来生成随机数。例如,NumPy 可能使用的是 Mersenne Twister 算法,而 C++ 标准库中的 <random> 可能也使用 Mersenne Twister,但其实现细节(如状态的初始化方式)可能不完全相同。

如何让两者的随机数相同

要使 NumPy 和 C++ 生成相同的随机数序列,有几种可能的方法:
  1. 使用相同的算法和种子:确保两种语言使用完全相同的随机数生成算法,并以相同方式初始化。在 C++ 中使用和 NumPy 相同的算法(如 Mersenne Twister),并以相同的方式设置种子。
  1. 在一种语言中生成后传递:在一种语言(如 Python)中生成随机数序列,然后将这些随机数传递给另一种语言(如 C++)。这种方式适用于需要确保实验在不同平台上可重复的情况。
  1. 使用第三方库:使用第三方库,如 Boost.Random,它在不同的编程环境中提供了一致的随机数生成器接口和实现。这样可以在 Python 和 C++ 中调用相同的库来生成随机数。
  1. 自定义随机数生成器:在两种语言中实现相同的随机数生成算法,确保完全控制随机数生成过程的每个细节。

Int示例

以下是一个示例,展示如何在 Python(使用 NumPy)和 C++ 中使用相同的 Mersenne Twister 算法和种子生成相似的随机数序列:
Python (NumPy):
C++:
这两个代码片段应当产生十分接近或相同的随机数序列,如果它们在初始化和调用上保持一致的话。但是,请注意,即使使用了相同的算法和种子,由于库的实现差异(如状态初始化和随机数抽样方法),最终结果可能仍有差异。在实际应用中,验证两种语言生成的随机数序列是否完全一致非常重要。
 

运行结果:

 

Float示例

同理,如果需要在 C++ 和 Python 中生成范围在 0 到 1 之间的浮点数,并尽量保证结果的一致性,你需要在两种语言中使用相同的随机数生成算法,并且调用相似的生成函数。以下是修改后的示例:

Python (NumPy) 示例

C++ 示例

在 C++ 中,你可以使用 <random> 头文件中的 std::uniform_real_distribution 来生成指定范围内的浮点数。和 Python 中的 NumPy 使用相同的 Mersenne Twister 算法(std::mt19937):
 

运行结果:

 
显然,float的生成方式结果有区别。 但Int结果是一致的。
 
注意,虽然这两个示例使用了相同的算法和种子,由于浮点运算和库实现的细微差别,生成的随机浮点数在细微数值上可能有所不同。
如果精确一致性是一个关键需求,考虑在一个环境中生成所有所需的随机数,然后将这些数导入到另一个环境中使用。这样可以完全避免由于环境差异导致的随机数生成差异。
 

将Int结果转换成Float

由于整数和浮点数的表示方式和计算精度不同,使用整数随机数转换成浮点数是一个可行的方法,以期在不同的编程环境中获取更一致的结果。

方法描述

你可以首先生成一个整数随机数序列,然后将这些整数映射到浮点数范围内。这种方法的优点是整数的随机性和一致性通常在不同的环境下更容易维持。下面是如何实现这一转换的步骤:
  1. 生成整数随机数:首先在 [0, N] 的范围内生成整数随机数。
  1. 转换为浮点数:将生成的整数映射到 [0.0, 1.0] 的浮点数区间。这可以通过除以 N 来实现,其中 N 是你生成随机整数的最大值。

Python 示例

假设我们使用 numpy 生成 09999 之间的整数,然后将这些整数转换为 [0.0, 1.0] 范围的浮点数:

C++ 示例

在 C++ 中,你可以按照类似的方法操作:

注意事项

使用这种方法,虽然可以在不同编程环境下获得更加一致的浮点数结果,但仍然需要注意几个问题:
  • 精度和范围:转换时使用的最大整数 N 应足够大,以确保浮点数的精度和覆盖范围。数值太小可能会导致浮点数的粒度太粗。
  • 性能考虑:对于大量的随机数生成,这种方法可能稍微增加计算负担,因为需要额外的除法操作。
  • 随机性质量:虽然整数的随机性容易保持一致,但浮点数的随机性质量也取决于整数范围的选择。
通过这种方法,你可以在不同的编程环境中获取更加一致的浮点数随机结果,同时也能保持良好的随机性。

🤗 总结归纳

为了让Python和C++生成相同的随机数,可以采用以下几种方法:使用相同的算法和种子;在一种语言中生成后传递;使用第三方库;自定义随机数生成器。然而,由于浮点运算和库实现的细微差别,生成的随机浮点数在细微数值上可能有所不同。如果精确一致性是一个关键需求,可以考虑在一个环境中生成所有所需的随机数,然后将这些数导入到另一个环境中使用。此外,使用整数随机数转换成浮点数是一个可行的方法,以期在不同的编程环境中获取更一致的结果。
<ins/>

📎 参考文章

 
 
 
 
上一篇
数据熵的概念与计算
下一篇
LLM中的Tokenizers