C++生成随机数
【摘要】
超级好用的C++随机数生成函数
一、下面的代码可以封装成头文件,文件名是util.h
#ifndef _OJ_DATA_UTIL_HEAD_
#define _OJ_DATA_UTIL_...
超级好用的C++随机数生成函数
一、下面的代码可以封装成头文件,文件名是util.h
#ifndef _OJ_DATA_UTIL_HEAD_
#define _OJ_DATA_UTIL_HEAD_
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
namespace oj_tools {
void init() { srand(time(NULL)); } //初始化随机数种子
LL randLong() { //产生longlong类型的随机数
LL x = rand();
LL y = rand();
return (x << 16) + y;
}
//产生double类型的随机数
inline double randDouble() { return (double)rand() / RAND_MAX; }
//产生范围为[start, end]范围的随机数
inline int randInt(int start, int end) {
return (int)((end - start + 1) * randDouble() + start);
}
//产生范围为[start, end]正态分布的随机数size个
vector<int> randIntsNormalDistribution(int start, int end, int size = 10) {
vector<int> v(size, 0);
for (int i = 0; i < size; i++) {
int tot = 0;
for (int j = 0; j < 2; j++)
tot += randInt(start, end);
v[i] = tot / 2;
}
return v;
}
//产生范围为[start, end]泊松分布的随机数size个
vector<int> randIntsPossionDistribution(int start, int end, int size = 10) {
vector<int> v(size, 0);
for (int i = 0; i < size; i++) {
int x = randInt(start, end);
int y = randInt(start, end);
v[i] = min(x, y);
}
return v;
}
//产生范围为[start, end]均匀分布的随机数size个
vector<int> randInts(int start, int end, int size = 10) {
vector<int> v(size, 0);
for (int i = 0; i < size; i++)
v[i] = randInt(start, end);
return v;
}
//产生范围为[start, end]等差数列的随机数size个
vector<int> equalDifferInts(int start, int end, int size = 10) {
vector<int> v(size);
int dif = (end - start + 1) / size;
v[0] = start;
for (int i = 1; i < size; i++) {
v[i] = v[i - 1] + dif;
}
v[size - 1] = end;
return v;
}
//产生范围为[start, end]等比数列的随机数size个
vector<int> equalRatioInts(int start, int end, int size = 10) {
vector<int> v(size, 0);
if (start == 0)
++start;
double q = pow(1.0 * end / start, 1.0 / (size - 1));
cout << q << endl;
v[0] = start;
for (int i = 1; i < size; i++)
v[i] = (int)(v[i - 1] * q);
v[size - 1] = end;
return v;
}
} // namespace oj_tools
#endif
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
二、主程序中的调用,随便写了一个测试程序makeInput.cpp
//头文件与主程序在同一文件夹下。否则要写相对路径,头文件名用双引号
#include "util.h"
int main(int argc, char const *argv[]) {
oj_tools::init();//初始化随机数种子,如果用了命名空间,就要写在双冒号前面,如果不想用命名空间的写法,就在头文件中去掉命名空间
int N = 10;
std::vector<int> nn = oj_tools::equalRatioInts(1, 1000, N);//得到N个成等比数列的数,范围在【1,1000】
std::vector<int> qq = oj_tools::equalRatioInts(1, 100000, N);
for (int k = 0; k < N; k++) {
ostringstream oss;
oss << "data" << k << ".in";
string str = oss.str();
ofstream cout(str.c_str());
int n = nn[k];
int q = qq[k];
if (n >= 800 && q >= 10000)
q /= 10;
cout << n << " " << q << endl;
vector<int> v_op = oj_tools::randInts(0, 2, q);//产生范围为[start, end]均匀分布的随机数size个
vector<int> v_x =
oj_tools::randIntsNormalDistribution(-1000000000, 1000000000, q);
vector<int> v_t = oj_tools::randInts(0, n - 1, q);
for (int i = 0; i < q; i++) {
int op = v_op[i];
cout << op;
if (op == 0) {
int t = v_t[i];
int x = v_x[i];
cout << " " << t << " " << x << endl;
} else {
int t = v_t[i];
cout << " " << t << endl;
}
}
}
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
文章来源: blog.csdn.net,作者:爱玲姐姐,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/jal517486222/article/details/84553963
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)