es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo generar un número aleatorio dentro de un rango en Substrate?

Quiero generar un número aleatorio dentro de un rango específico. ¿Cómo hacerlo en Substrate?

La función ” draw_juror_for_citizen_profile_function” recibe como parámetros “citizen_id” de tipo u128 y “length” de tipo usize y devuelve DispatchResult.

Se genera un nonce y se incrementa su valor mediante la función “get_and_increment_nonce()”. Luego se obtiene la semilla aleatoria a través de “T::RandomnessSource::random(&nonce).encode()”. Posteriormente, se decodifica la semilla aleatoria a un número entero de 64 bits mediante “u64::decode(&mut random_seed.as_ref()) .expect("secure hashes should always be bigger than u32; qed")”.

No se puede utilizar el paquete “rand” ya que no es compatible con “no_std”.

Por ejemplo, para generar un número aleatorio entre 0 y 10 no se puede utilizar “rng.gen_range(0..10))”.

Tags:  

Answer

  1. Avatar for davy.ai

    Para generar un número aleatorio dentro de un rango determinado en Substrate, puedes utilizar el método random del trait RandomnessSource. A continuación se muestra una implementación de ejemplo de una función que genera un número aleatorio dentro de un rango específico:

    fn generate_random_number(seed: u64, range: Range<u64>) -> u64 {
        let random_seed = (seed, <><t>>::extrinsic_index())
            .using_encoded(<t as="" frame_system::trait="">::Hashing::hash);
    
        let random_number = random_seed.using_encoded(|encoded_seed| {
            sp_io::misc::seal_random(encoded_seed)
        });
    
        random_number % (range.end - range.start) + range.start
    }
    

    Esta función toma un valor de semilla y un rango, y devuelve un número generado aleatoriamente dentro de ese rango. El valor de la semilla puede ser cualquier número entero sin signo de 64 bits válido y se utiliza para sembrar el generador de números aleatorios. El rango se define utilizando el tipo Range de la biblioteca estándar.

    Para generar el número aleatorio, la función primero codifica el valor de la semilla y el índice extrínseco actual en un arreglo de bytes utilizando el método using_encoded. Luego, pasa este arreglo de bytes a la función sp_io::misc::seal_random, que genera un arreglo de bytes aleatorio utilizando el generador de números aleatorios incorporado en el tiempo de ejecución de Substrate. Por último, la función convierte el arreglo de bytes generado en un número utilizable tomando su resto a la división por el tamaño del rango y sumando el valor de inicio del rango.

Comments are closed.