如何将对象“std :: rand :: task_rng()”传递给Rust中的函数?

时间:2013-10-30 08:26:35

标签: rust

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

的测试
"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”传递给函数?

2 个答案:

答案 0 :(得分: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())

答案 1 :(得分:0)

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

task_rng函数的签名是:

pub fn task_rng() -> @mut TaskRng

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

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

事情应该很好。