是否可以使用 ONE SINGLE 语句从一组数字中打印 C++ 中的随机数?
假设集合是 {2, 5, 22, 55, 332}
我查找了 rand() 但我怀疑是否可以在单个语句中完成。
int numbers[] = { 2, 5, 22, 55, 332 };
int length = sizeof(numbers) / sizeof(int);
int randomNumber = numbers[rand() % length];
毫无意义地将事物变成单个表达式实际上是发明三元运算符的目的(我没有 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;)
现在,让我们永远不再谈论这一天。
假设这些数字是一组大小为 5 的数字,您所要做的就是找到一个随机值乘以 5(使其等概率)。假设 rand() 方法返回一个介于 0 到 1 之间的随机值。将其乘以 5 并将其转换为整数,您将获得 0 到 4 之间的等概率值。使用它从索引中获取。
我不知道 C++ 中的语法。但这就是它应该看起来的样子
my_rand_val = my_set[(int)(rand()*arr_size)]
这里我假设 rand() 是一个返回 0 到 1 之间值的方法。
是的,有可能。不是很直观,但你要求它:
#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;
}
您的“单一陈述”标准非常模糊。你的意思是一个机器指令,一个标准库调用?
如果你的意思是一条机器指令,答案是否定的,没有特殊的硬件。
如果您的意思是一个函数调用,那么当然是可能的。你可以编写一个简单的函数来做你想做的事:
#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;
}