一组中的C++随机数

use*_*514 4 c++ random srand

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

假设这个集是{2,5,22,55,332}

我查了一下rand()但是我怀疑它可以在一个声明中完成.

Li0*_*liQ 11

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


Ste*_*sop 5

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

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

请不要惹恼我的代码审查员.

啊,我们在这里,一个适当的均匀分布(假设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.
Run Code Online (Sandbox Code Playgroud)

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

for (unsigned int n = (srand((time(0) % UINT_MAX)), 5*CHUNK); n >= 5*CHUNK;)
Run Code Online (Sandbox Code Playgroud)

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

  • 看起来像(假设`rand()%N`的结果很好 - 根据需要用更好的发生器替换).有一个"1/5"机会得到2.有一个`(4/5)*(1/4)= 1/5'获得5等的机会. (4认同)
  • `rand()`的多次调用是否保持每个选项的概率相同?我在概率计算上的表现不是很好:) (2认同)

bra*_*boy 2

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

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

my_rand_val = my_set[(int)(rand()*arr_size)]
Run Code Online (Sandbox Code Playgroud)

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