Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在c++;_C++_Random - Fatal编程技术网

C++ 如何在c++;

C++ 如何在c++;,c++,random,C++,Random,我写了一个接受整数的函数。如果用户键入例如,-5,它不会崩溃,但它会将其转换为正数=-( 为了构建随机负整数,我应该在函数中更改什么? 用户输入范围。对于闭合范围内的数字[上下],您需要: return lower + rand() % (upper - lower + 1); // NOT 1 + ... 只要上限大于或等于下限,这将适用于正值或负值 您的版本返回相同大小范围内的数字,但从1开始,而不是从lower开始。对于封闭范围内的数字[下限,上限],您需要: return lowe

我写了一个接受整数的函数。如果用户键入例如,-5,它不会崩溃,但它会将其转换为正数=-(

为了构建随机负整数,我应该在函数中更改什么?
用户输入范围。

对于闭合范围内的数字
[上下]
,您需要:

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()返回时,左操作数将始终为正,因此整个表达式必须始终为正。看到了吗