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

时间:2015-11-09 02:59:38

标签: c++

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

num1 = rand()%15+1;

但是在这个1-15范围之间,我想阻止一些数字被分配到num1变量。

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

但是,我最感兴趣的是,是否有更有效的方法可以忽略rand()函数范围内的这些不需要的数字。

非常感谢你!

3 个答案:

答案 0 :(得分:6)

一个非常简单的解决方案:调用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 :(得分:5)

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

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

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

我放置了一个正在运行的示例here

答案 2 :(得分:3)

要获得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作为建议的owacoder 你也看到视频(来自编写VS STL一部分的MS家伙)关于如何获得真实随机数的视频,以及为什么不能使用rand

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