在C++中等价于这个Python随机数生成器的实现?

5 投票
5 回答
2582 浏览
提问于 2025-04-17 01:36

我刚从Python转到C++,现在开始把我用Python写的工具用C++重写,以便更好地理解,但这个问题我解决不了……

这个函数会生成一系列随机数字,比如说“randomRange(12)”可能会返回12个数字,像“823547896545”这样的。

Python:

  def randomRange(n):
        range_start = 10**(n-1)
        range_end = (10**n)-1
        return randint(range_start, range_end)

  number = randomRange(12)

C++:

  int n;
  int randomRange(n){
        int range_start = ?
        int range_end = ?
        int result = ?(range_start, range_end);
        return (result);
  };

  int number = randomRange(12);

我找不到问号“?”的对应用法。

5 个回答

1

你基本上只需要用到 rand 这个函数,它可以按照你的需求来生成随机数:

int result = (rand() % (range_end - range_start)) + range_start;

简单来说,rand() 会在一组整数值中生成一个随机数。你可以使用取模操作来限制生成数字的范围,然后用你的起始值来调整这个范围。

(另外,记得要 给随机数生成器设置种子

注意
听说rand生成的随机数质量不太好(我之前不知道)。可以看看评论区的讨论。

2

你可以看看boost库里的功能:

http://www.boost.org/doc/libs/1_47_0/doc/html/boost_random/tutorial.html#boost_random.tutorial.generating_integers_in_a_range

C++11里也有类似的功能:

http://en.cppreference.com/w/cpp/numeric/random

int randomRange(n)
{
    int range_start = (int)pow(10, n-1);
    int range_end = (int)pow(10, n) - 1;
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_int_distribution<> dist(range_start, range_end);
    return dist(gen);
}

注意,把除了dist(gen)以外的部分放到一个只调用一次的初始化函数里,可以让性能更好。

4

如果你用很大的数字n,可能会发现随机性不好,但:

#include <math.h>         // for pow()
#include <stdlib.h>       // for drand48()

long randomRange(int n)
{
    // our method needs start and size of the range rather 
    // than start and end.
    long range_start = pow(10,n-1);
    long range_size = pow(10,n)-range_start;
    // we expect the rand48 functions to offer more randomness
    // than the more-well-known rand() function. drand48()
    // gives you a double-precision float in 0.0-1.0, so we 
    // scale up by range_size and and to the start of the range.
    return range_start + long(drand48() * range_size);
};

还有一种方法。在32位的平台上,整数最多只能处理9位数字,所以我们可以让这个函数返回一个双精度浮点数(double),然后生成一串ASCII数字,再进行转换:

#include <math.h>         // for pow()
#include <stdlib.h>       // for atof()

// arbitrary limit
const int MAX_DIGITS = 24;

double randomRange(int n)
{
    char bigNumString[ MAX_DIGITS+1 ];
    if (n > MAX_DIGITS)
    {
        return 0;
    }
    // first digit is 1-9
    bigNumString[0] = "123456789"[rand()%9];
    for (int i = 1; i < n; i++)
    {
        // subsequent digits can be zero
        bigNumString[i] = "0123456789"[rand()%10];
    }
    // terminate the string
    bigNumString[i] = 0;
    // convert it to float
    return atof(bigNumString);
};

撰写回答