Domanda

E 'possibile stampare un numero casuale in C ++ da un insieme di numeri con UNA SINGOLA affermazione?

Diciamo che il set è {2, 5, 22, 55, 332}

Ho guardato rand (), ma dubito che sia possibile fare in una singola istruzione.

È stato utile?

Soluzione

Di 'questi numeri sono in un insieme di dimensioni 5, tutto quello che devi fare è trovare un valore casuale moltiplicato per 5 (per renderlo equi probabile). Assumere la rand () metodo che restituisce un valore casuale tra compreso tra 0 e 1. Moltiplicare la stessa da 5 e gettalo via a intero otterrete valori equiprobabili tra 0 e 4. Utilizzare che per andare a prendere dall'indice.

Non so la sintassi in C ++. Ma questo è come dovrebbe apparire

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

Qui presumo rand () è un metodo che restituisce un valore compreso tra 0 e 1.

Altri suggerimenti

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

Inutilmente trasformare le cose in una sola espressione è praticamente ciò che l'operatore ternario è stato inventato per (sto avendo nessuno di inganno composto-dichiarazione di litb):

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

Si prega di non ratto su di me per il mio codice revisore.

Ah, qui andiamo, una corretta distribuzione uniforme (rand() supponendo che è uniforme sulla sua gamma) in quello che si potrebbe forse chiamare una "dichiarazione unica", a un tratto.

E 'un'iterazione-affermazione, ma poi così è un ciclo for con un grande blocco di grande che contiene più istruzioni. La sintassi non distingue. Questo in realtà contiene due affermazioni: il tutto è una dichiarazione, e il tutto esclusa la parte for(...) è una dichiarazione. Quindi probabilmente "una singola istruzione" si intende una singola espressione-dichiarazione, che non è questo. Ma comunque:

// 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.

Se questo sarà l'unico codice in tutto il programma, e non si vuole che torni lo stesso valore ogni volta, quindi è necessario chiamare srand(). Fortunatamente questo può essere montato in Modificare la prima riga:.

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

Ora, cerchiamo di non parlare di questo nuovo giorno.

Sì, è possibile. Non molto intuitivo, ma lei ha chiesto per esso:

#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;
}    

Le tue indicazioni per "singola istruzione" è molto vaga. Vuoi dire istruzione di una macchina, una chiamata stdlib?

Se vuoi dire un'istruzione macchina, la risposta è no, senza hardware speciale.

Se vuoi dire una chiamata di funzione, poi, naturalmente, è possibile. Si potrebbe scrivere una funzione semplice da fare ciò che si vuole:

#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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top