C++生成随机数

举报
楚楚冻人玥玥仙女 发表于 2021/11/19 03:34:44 2021/11/19
【摘要】 超级好用的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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。