Pergunta

É possível imprimir um número aleatório em C ++ a partir de um conjunto de números com um comando único?

Vamos dizer que o conjunto é {2, 5, 22, 55, 332}

Eu olhei para cima rand (), mas eu duvido que é possível fazer em uma única instrução.

Foi útil?

Solução

Say estes números estão em um conjunto de tamanho 5, tudo que você precisa fazer é encontrar um valor aleatório multiplicado por 5 (para torná-lo equi provável). Suponha que o rand () retorna lhe um valor aleatório entre intervalo de 0 a 1. Multiplique o mesmo por 5 e lançá-lo para inteiro você terá valores equiprováveis ??entre 0 e 4. Uso que buscar a partir do índice.

Eu não sei a sintaxe em C ++. Mas é assim que deve olhar

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

Aqui eu assumo rand () é um método que retorna um valor entre 0 e 1.

Outras dicas

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

inutilmente transformar as coisas em uma única expressão é praticamente o que o operador ternário foi inventado para (Eu estou tendo nenhum dos artifícios composto declaração de litb):

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

Por favor, não rato em mim ao meu revisor código.

Ah, aqui vamos nós, uma distribuição uniforme apropriado (rand() assumindo é uniforme em sua gama) em que você poderia talvez chamar uma "declaração única", em um trecho.

É uma iteração-afirmação, mas então é um loop for com uma grande grande bloco contendo várias instruções. A sintaxe não faz distinção. Isso realmente contém duas declarações: a coisa toda é uma afirmação, e toda a coisa excluindo a parte for(...) é uma declaração. Então, provavelmente, "uma única instrução" significa uma única expressão-declaração, que não é esse. Mas de qualquer maneira:

// 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 isso vai ser o único código em todo o programa, e você não quer que ele retorne o mesmo valor cada vez, então você precisa chamar srand(). Felizmente, este pode ser instalado em Alterar a primeira linha para:.

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

Agora, vamos nunca falam deste dia novamente.

Sim, é possível. Não é muito intuitivo, mas você pediu para ele:

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

Os seus parâmetros "única instrução" é muito vago. Você quer dizer uma instrução de máquina, uma chamada stdlib?

Se você quer dizer uma instrução de máquina, a resposta é não, sem hardware especial.

Se você quer dizer uma chamada de função, então é claro que é possível. Você poderia escrever uma função simples para fazer o que quiser:

#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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top