一组中的C ++随机数

时间:2010-03-14 18:54:43

标签: c++ random srand

是否可以使用ONE SINGLE语句从一组数字中打印C ++中的随机数?

假设该集合是{2,5,22,55,332}

我抬头看了兰德(),但我怀疑是否可以在一个声明中做到。

5 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:5)

毫无意义地将事物变成单个表达式实际上是三元运算符发明的原因(我没有litb的复合语句技巧):

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

请不要老鼠对我的代码审查员。

啊,这里我们去,一个适当的均匀分布(假设rand()在其范围内是统一的),你可以在一段时间内称之为“单一陈述”。

这是一个迭代语句,但是一个for循环带有一个包含多个语句的大块。语法不区分。这实际上包含两个语句:整个事情是一个语句,排除for(...)部分的整个事件是一个语句。因此,“单个语句”可能意味着单个表达式语句,但事实并非如此。但无论如何:

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

如果这将是整个程序中唯一的代码,并且您不希望它每次都返回相同的值,那么您需要调用srand()。幸运的是,这可以适应。将第一行更改为:

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

现在,让我们再也不谈论这一天了。

答案 2 :(得分:2)

假设这些数字是一组大小为5,你要做的就是找到一个随机值乘以5(使其成为等概率)。假设rand()方法返回一个介于0到1之间的随机值。将它乘以5并将其转换为整数,您将获得0到4之间的等概率值。使用它从索引中获取。

我不知道C ++中的语法。但这应该是它的样子

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

这里我假设rand()是一个返回介于0和1之间的值的方法。

答案 3 :(得分:0)

是的,有可能。不是很直观,但你要求它:

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

答案 4 :(得分:0)

您的“单一陈述”标准非常模糊。你的意思是一个机器指令,一个stdlib调用吗?

如果你的意思是一台机器指令,答案是否定的,没有特殊的硬件。

如果你的意思是一个函数调用,那么当然有可能。您可以编写一个简单的函数来执行您想要的操作:

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