Pregunta

Es posible la impresión de un número aleatorio en C++ a partir de un conjunto de números con UNA SOLA instrucción?

Digamos que el conjunto es {2, 5, 22, 55, 332}

Miré hacia arriba rand (), pero me cabe duda de que es posible hacer en una sola instrucción.

¿Fue útil?

Solución

dicen que estos números están en un conjunto de tamaño 5, todo lo que tienes que hacer es encontrar un valor aleatorio que se multiplica por 5 (para que sea equi probable). Supongamos que el rand () método que devuelve un valor aleatorio entre rango de 0 a 1. Multiplicar la misma por 5 y echarlo a un entero obtendrá los valores equiprobables entre 0 y 4. El uso que para ir a buscar en el índice.

No sé la sintaxis en C ++. Pero esto es cómo debe mirar

my_rand_val = my_set[(int)(rand()*arr_size)]

Aquí Asumo rand () es un método que devuelve un valor entre 0 y 1.

Otros consejos

int numbers[] = { 2, 5, 22, 55, 332 };
int length = sizeof(numbers) / sizeof(int);
int randomNumber = numbers[rand() % length];

Inútilmente cambiando las cosas en una sola expresión es prácticamente lo que el operador ternario fue inventado para (tengo ninguno de litb del compuesto-declaración de engaño):

std::cout << ((rand()%5==0) ? 2 : 
              (rand()%4==0) ? 5 : 
              (rand()%3==0) ? 22 : 
              (rand()%2==0) ? 55 : 
              332
             ) << std::endl;

Por favor, no rata en mi código revisor.

Ah, aquí vamos, una adecuada distribución uniforme (suponiendo que rand() es uniforme en su gama), en lo que tal vez podría llamar un "estado único", en un tramo.

Es una iteración de instrucción, pero también lo es de un bucle for con un gran bloque que contiene varias instrucciones.La sintaxis no distinguir.Esta realidad contiene dos afirmaciones:todo el asunto es una declaración, y toda la cosa, excluyendo el for(...) parte es una declaración.Así que, probablemente, "una sola instrucción" significa una sola expresión de instrucción, que este no lo es.Pero de todos modos:

// weasel #1: #define for brevity. If that's against the rules,
// it can be copy and pasted 7 times below.
#define CHUNK ((((unsigned int)RAND_MAX) + 1) / 5)

// weasel #2: for loop lets me define and use a variable in C++ (not C89)
for (unsigned int n = 5*CHUNK; n >= 5*CHUNK;)
    // weasel #3: sequence point in the ternary operator
    ((n = rand()) < CHUNK) ? std::cout << 2 << "\n" :
             (n < 2*CHUNK) ? std::cout << 5 << "\n" :
             (n < 3*CHUNK) ? std::cout << 22 << "\n" :
             (n < 4*CHUNK) ? std::cout << 55 << "\n" :
             (n < 5*CHUNK) ? std::cout << 332 << "\n" :
             (void)0;
             // weasel #4: retry if we get one of the few biggest values
             // that stop us distributing values evenly between 5 options.

Si este va a ser el único código en todo el programa, y no lo quiere devolver el mismo valor cada vez, entonces usted necesita para llamar srand().Afortunadamente, esto puede ser equipado.El cambio de la primera línea:

for (unsigned int n = (srand((time(0) % UINT_MAX)), 5*CHUNK); n >= 5*CHUNK;)

Ahora, vamos a hablar de este día de nuevo.

Sí, es posible. No es muy intuitivo, pero se preguntó por él:

#include <time.h>
#include <stdlib.h>
#include <iostream>

int main()
{
    srand(time(0));

    int randomNumber = ((int[]) {2, 5, 22, 55, 332})[rand() % 5];

    std::cout << randomNumber << std::endl;

    return 0;
}    

Sus criterios de "solo estado" es muy vaga. ¿Se refiere a una instrucción de máquina, una llamada stdlib?

Si se refiere a una instrucción de máquina, la respuesta es no, sin necesidad de hardware especial.

Si se refiere a una llamada de función, entonces por supuesto que es posible. Se podría escribir una función simple de hacer lo que quiere:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int setSize = 5;
    int set[] = {2, 5, 22, 55, 332 };
    srand( time(0) );

    int number = rand() % setSize;
    printf("%d %d", number, set[number]);
    return 0;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top