繁体   English   中英

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM