C++ 如何在c++;
我写了一个接受整数的函数。如果用户键入例如,-5,它不会崩溃,但它会将其转换为正数=-( 为了构建随机负整数,我应该在函数中更改什么?C++ 如何在c++;,c++,random,C++,Random,我写了一个接受整数的函数。如果用户键入例如,-5,它不会崩溃,但它会将其转换为正数=-( 为了构建随机负整数,我应该在函数中更改什么? 用户输入范围。对于闭合范围内的数字[上下],您需要: return lower + rand() % (upper - lower + 1); // NOT 1 + ... 只要上限大于或等于下限,这将适用于正值或负值 您的版本返回相同大小范围内的数字,但从1开始,而不是从lower开始。对于封闭范围内的数字[下限,上限],您需要: return lowe
用户输入范围。对于闭合范围内的数字
[上下]
,您需要:
return lower + rand() % (upper - lower + 1); // NOT 1 + ...
只要上限
大于或等于下限
,这将适用于正值或负值
您的版本返回相同大小范围内的数字,但从
1
开始,而不是从lower
开始。对于封闭范围内的数字[下限,上限]
,您需要:
return lower + rand() % (upper - lower + 1); // NOT 1 + ...
只要上限
大于或等于下限
,这将适用于正值或负值
您的版本从相同大小的范围返回数字,但从
1
开始,而不是从lower
开始,如果您不介意依赖性,也可以使用Boost.Random。如果您不介意依赖性,也可以使用Boost.Random。您想从计算数字的范围开始,所以(例如)-10到+5是15的范围
您可以使用如下代码计算该范围内的数字:
int rand_lim(int limit) {
/* return a random number in the range [0..limit)
*/
int divisor = RAND_MAX/limit;
int retval;
do {
retval = rand() / divisor;
} while (retval == limit);
return retval;
}
这样做之后,将数字设置到正确的范围是非常简单的:将下限添加到您得到的每个数字上
请注意,C++11添加了随机数生成器和分发类,它们可以为您解决大部分问题
如果你自己尝试这样做,当你把数字缩小到一个范围时,你几乎需要使用一个循环,正如我在上面所展示的那样,以避免扭曲。本质上,任何单独使用除法或余数的尝试几乎不可避免地会导致扭曲结果(即,某些结果会比其他结果更频繁).您希望首先计算数字的范围,因此(例如)-10到+5是15的范围 您可以使用如下代码计算该范围内的数字:
int rand_lim(int limit) {
/* return a random number in the range [0..limit)
*/
int divisor = RAND_MAX/limit;
int retval;
do {
retval = rand() / divisor;
} while (retval == limit);
return retval;
}
这样做之后,将数字设置到正确的范围是非常简单的:将下限添加到您得到的每个数字上
请注意,C++11添加了随机数生成器和分发类,它们可以为您解决大部分问题
如果你自己尝试这样做,当你把数字缩小到一个范围时,你几乎需要使用一个循环,正如我在上面所展示的那样,以避免扭曲。本质上,任何单独使用除法或余数的尝试几乎不可避免地会导致扭曲结果(即,某些结果会比其他结果更频繁).您只需求和到范围的下限
[lbound,ubound]
:
int rangesize = ubound - lbound + 1;
int myradnom = (rand() % rangesize) + lbound;
您只需要求和到范围的下限
[lbound,ubound]
:
int rangesize = ubound - lbound + 1;
int myradnom = (rand() % rangesize) + lbound;
对此有两个答案,如果您使用的是C++11,那么您应该使用,出于许多原因,这是一个更好的选择。例如,这是一个示例,给出了一组更完整的原因。下面是一个示例,它生成了从
-5到5的随机整数:
#include <iostream>
#include <random>
int main()
{
std::random_device rd;
std::mt19937 e2(rd());
std::uniform_int_distribution<int> dist(-5, 5);
for (int n = 0; n < 10; ++n) {
std::cout << dist(e2) << ", " ;
}
std::cout << std::endl ;
}
对此有两个答案,如果您使用的是C++11,那么您应该使用,出于许多原因,这是一个更好的选择。例如,这是一个示例,给出了一组更完整的原因。下面是一个示例,它生成了从-5到5的随机整数:
#include <iostream>
#include <random>
int main()
{
std::random_device rd;
std::mt19937 e2(rd());
std::uniform_int_distribution<int> dist(-5, 5);
for (int n = 0; n < 10; ++n) {
std::cout << dist(e2) << ", " ;
}
std::cout << std::endl ;
}
是的,基本上你不能有一个负的余数,所以你的mod结果总是正的。你应该有另一个随机机制,它会自动返回负数,即,if rand()% 2=0</CODE。返回的数字可以是从负到正。我使用Visual Studio 2010。它带有C++ 10。3XXXX@Pokarface7抱歉,我的错误,如果左操作数为负,则余数可以为负。从rand()返回时,左操作数将始终为正所以整个表达式必须始终是正的。是的,本质上你不能有负余数,所以你的mod结果将始终是正的。你应该有另一个随机机制,它会自动返回负的,即,if rand()% 2=0</CODE。返回的数字可以是从负到正。我使用Visual Studio 2010。它带有C++ 10。3XXXX@Pokarface7抱歉,我的错误,如果左操作数为负,则余数可以为负。从rand()返回时,左操作数将始终为正,因此整个表达式必须始终为正。看到了吗