1

我有一个测试程序,我需要在其中生成一个随机数。因此,我做了一个测试比较使用

"uVal = rand::task_rng().gen();"

与使用例如创建对象相比,每次生成随机数时。:

let mut oRandom = std::rand::task_rng()

并生成多个随机数。使用创建的对象(oRandom)要快得多,所以我认为我应该将对象传递给生成随机数的函数,但是我一直无法找到一种方法来做到这一点。这并不重要,但我认为可以做到。

示例 1:不使用对象:(比 2 慢得多)

let mut uVal : u8;
for _ in range(1, iMax) {
    uVal = std::rand::task_rng().gen();

示例 2:使用对象:(比 1 快得多)

let mut oRandom = std::rand::task_rng();
let mut uVal : u8;
for _ in range(1, iMax) {
    uVal = oRandom.gen();

示例 3:我尝试将对象传递给函数:

12  let mut oRandom = std::rand::task_rng();
13  fTest03(iMax, &mut oRandom);    

53  fn fTest03(iMax : i64, oRandom : &mut std::rand::task_rng) {

This results in the following error :

    test_rand003.rs:53:38: 53:57 error: use of undeclared type name
        `std::rand::task_rng`
    test_rand003.rs:53 fn fTest03(iMax : i64, oRandom : &mut std::rand::task_rng) {

如何将上面第 13 行中的变量“oRandom”传递给函数?

4

2 回答 2

1

有两种方法,任何一种都可以使用通用方法,因此如果您决定停止使用任务本地方法,它可以与其他 RNG 一起使用:

fn fTest03<R: Rng>(iMax: i64, oRandom: &mut R) { ... }

或者,您可以直接使用返回类型task_rng

fn fTest03(iMax: i64, oRandom: @mut IsaacRng) { ... }

(您可能必须导入Rng/IsaacRng或完全限定它们,例如std::rand::Rng。)

任何一个都应该与fTest03(10, std::rand::task_rng()).

于 2013-11-06T10:46:06.297 回答
0

task_rng() 不是一种类型,它是一个返回任务本地随机数生成器 (TaskRng) 的函数。

task_rng 函数的签名是:

pub fn task_rng() -> @mut TaskRng

因此,如果您将第 53 行更改为:

fn fTest03(iMax : i64, oRandom : &mut std::rand::Rng) {...

事情应该很好。

于 2013-10-30T15:42:11.570 回答