如何从 rand() 函数的范围中省略一些数字?

How to omit some numbers from rand() function's range?

本文关键字:中省 数字 范围 rand 函数      更新时间:2023-10-16

我需要使用rand()函数来获取1-15之间的数字,所以我只使用了下面的函数。

num1 = rand()%15+1;

但在这个1-15的范围内,我想防止一些数字被分配到num1变量中。

我想在那里放一个if-else函数,因为rand()函数会在出现不需要的数字的情况下重复它自己。

然而,我最好奇的是,是否有更有效的方法可以从rand()函数的范围中省略这些不需要的数字。

非常感谢!

一个非常简单的解决方案:用一个等于输出范围内数字总数的模值调用rand()。然后定义一个映射函数,将值映射到所需的特定输出范围中。

例如:要获得1到5或11到15之间的随机值,包括:

int map(int val)
{
    if (val > 5)
        return val+5;
    else
        return val;
}
int value = rand()%10+1;
value = map(value);

你想要的声音,例如集合{1,2,3,7,8,9,14,15}的随机数(不是吗)?

因此,对于这个例子,这是一个8个不同值的计数,你可以这样做:

lookupTable[] = { 1, 2, 3, 7, 8, 9, 14, 15 };
num1 = lookupTable[rand() % 8];

我在这里放了一个运行示例。

要获得1到15之间的真实随机数,可以使用这样的C++11代码:

#include <iostream>
#include <random>
int main()
{
        std::random_device rd;
        std::mt19937 mt(rd());
        std::uniform_int_distribution<int> dist(1, 15);
    for (int i = 0; i < 100; ++i)
        std::cout << dist(mt) << ", ";
}

要删除其中的一些数字,您可以使用map作为编码器的建议你还可以看到视频(来自MS guy,他写了VSSTL的一部分),关于如何获得真正的随机数,以及为什么rand不能用于此:

https://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful