python - 为什么使用 Numba xoroshiro128p 得到与随机数组相同的数字?
问题描述
为什么我使用 Numba 得到与随机数组相同的数字xoroshiro128p
?我想要和 Numpy random array 一样np.random.rand
。
from numba import cuda
from numba.cuda.random import create_xoroshiro128p_states, xoroshiro128p_uniform_float32
import numpy as np
@cuda.jit
def rand_array(rng_states, out):
thread_id = cuda.grid(1)
x = xoroshiro128p_uniform_float32(rng_states, thread_id)
out[thread_id] = x
threads_per_block = 4
blocks = 3
rng_states = create_xoroshiro128p_states(threads_per_block * blocks, seed=1)
out = np.zeros(threads_per_block * blocks, dtype=np.float32)
rand_array[blocks, threads_per_block](rng_states, out)
rar = np.random.rand(12).reshape(blocks, threads_per_block)
print(out.reshape(blocks,threads_per_block))
print()
print(rar.reshape(blocks,threads_per_block))
每次运行它,我都会看到相同的数字。不过np.random.rand
效果很好。预先感谢您的帮助!
解决方案
发送种子 = 1,几乎可以肯定意味着随机数生成器(毕竟只是一个复杂的算法)从序列中完全相同的位置开始。因此生成相同的随机数序列。
以完全可预测的方式生成相同序列的能力在测试中非常有用,但在生产环境中,您需要更不可预测的种子
尝试 :
rng_states = create_xoroshiro128p_states(threads_per_block * blocks, seed=time.time())
由于时钟时间是不可预测的,因此序列将从不同的点开始生成,并且 rng_states 的可预测性将大大降低。显然,您需要import time
在脚本的开头。显然,这意味着您的代码现在每次都会生成一个随机序列,这将使测试变得困难。
推荐阅读
- css - 生成字体的 SCSS @each 规则不适用于输出
- php - 爆炸功能还是其他原因?
- python - 在 Plotly 中为具有相应边的每个节点添加图例
- angular - 如何使用 NPM 在 Angular 10 中安装引导 ngx
- unit-testing - Elixir 的 Mix 负载源是否可能来自多个路径?
- python - Python pandas在时间列上合并数据帧意外结果
- c++ - 关于这个递归函数的问题
- regex - 从 Jmeter 字符串响应中解析值
- django - 使用外键限制要添加到 Django 模型的条目数
- python-3.x - 使用嵌套循环不正确的循环