Question

Est-il possible d'imprimer un nombre aléatoire en C ++ à partir d'un ensemble de nombres avec un état unique?

Disons que l'ensemble est {2, 5, 22, 55, 332}

J'ai regardé rand () mais je doute qu'il est possible de le faire en une seule instruction.

Était-ce utile?

La solution

Dites ces chiffres sont dans un ensemble de taille 5, tout ce que vous devez faire est de trouver une valeur aléatoire multipliée par 5 (pour le rendre equi probable). Supposons que la méthode renvoie une valeur aléatoire rand () entre entre 0 et 1. Multiplier le même par 5 et de le jeter en entier, vous obtiendrez des valeurs équiprobables entre 0 et 4. utiliser pour extraire de l'indice.

Je ne sais pas la syntaxe en C ++. Mais voici comment il devrait ressembler

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

Ici, je suppose rand () est une méthode qui renvoie une valeur comprise entre 0 et 1.

Autres conseils

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

les choses en tournant inutilement une seule expression est pratiquement ce que l'opérateur ternaire était inventé pour (je vais avoir pas de supercherie-instruction composé litb):

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

S'il vous plaît ne pas rat sur moi à mon avis de code.

Ah, on y va, une bonne distribution uniforme (en supposant rand() est uniforme sur sa gamme) dans ce que vous pourriez peut-être appeler un « simple déclaration », à un bout droit.

Il est une instruction-itération, mais il en est une boucle avec un grand bloc contenant plusieurs instructions. La syntaxe ne distingue pas. Il contient en fait deux déclarations: l'ensemble est une déclaration, et l'ensemble excluant la partie de for(...) est une déclaration. Donc, probablement « une déclaration unique » signifie une seule expression déclaration, ce n'est pas. Mais de toute façon:

// 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 cela va être le seul code dans l'ensemble du programme, et vous ne voulez pas revenir la même valeur à chaque fois, vous devez appeler srand(). Heureusement, cela peut être monté dans Changer la première ligne à:.

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

Maintenant, nous ne parlons jamais de ce jour à nouveau.

Oui, il est possible. Pas très intuitif, mais vous l'avez demandé:

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

Vos critères « déclaration unique » est très vague. Voulez-vous dire une instruction de la machine, un appel stdlib?

Si vous voulez dire une instruction de la machine, la réponse est non, sans matériel spécial.

Si vous voulez dire un appel de fonction, puis bien sûr, il est possible. Vous pouvez écrire une fonction simple à faire ce que vous voulez:

#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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top