Как я могу создать случайный массив между двумя другими массивами? - PullRequest
0 голосов
/ 26 мая 2019

Мне нужно создать массив случайных 20 байтов между заданным диапазоном массивов. Поскольку массивы в Rust сравнимы, это работает:

let low = [0u8; 20];
let high = [2u8; 20];
assert_eq!(true, low < high);
assert_eq!(false, low > high);
assert_eq!(true, low == [0u8; 20]);

Для этих границ:

let low: [u8; 20] = [98, 0, 1, 0, 2, 6, 99, 3, 0, 5, 23, 3, 5, 6, 11, 8, 0, 2, 0, 17];
let high: [u8; 20] = [99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1];

Это будет действительный результат:

[98, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

Это не:

[98, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2]

Я хочу сделать что-то вроде:

use rand::prelude::*;

fn main() {
    let low = [0u8; 20];
    let high = [2u8; 20];
    let value = rand::thread_rng().gen_range(low, high);
    println!("{:?}", value);
}

но я получаю следующую ошибку:

error[E0277]: the trait bound `[u8; 20]: rand::distributions::uniform::SampleUniform` is not satisfied
 --> src\main.rs:6:36
  |
6 |     let value = rand::thread_rng().gen_range(low, high);
  |                                    ^^^^^^^^^ the trait `rand::distributions::uniform::SampleUniform` is not implemented for `[u8; 20]`

Я попытался реализовать SampleUniform и UniformSampler без особого успеха. Есть ли простой способ реализовать это?

1 Ответ

1 голос
/ 27 мая 2019

Если вы хотите рассматривать байтовые массивы как большие целые числа, используйте ящик num-bigint с включенной функцией rand:

use bigint::{ToBigInt, RandBigInt};

let low = -10000.to_bigint().unwrap();
let high = 10000.to_bigint().unwrap();
let b = rng.gen_bigint_range(&low, &high);

Вы также можете использовать целые числа без знакавместо подписанного.Существуют методы преобразования в байтовые массивы с прямым порядком байтов и из них:

См. Также:

...