数据生成器1.0

news/2024/12/27 19:23:46/文章来源:https://www.cnblogs.com/cjyqaq/p/18636581

开发日志:
12.27:
根据李煜东小蓝书制作了一款随机数据生成器,目前支持数据类型:
A:生成长度为 n 整数序列。
B:生成 m 个 [1 , n] 的子区间。
C:生成一颗 n 个节点的无向树。
D:生成一幅 n 个节点, m 条边的无向图。
E:生成一幅 n 个节点的链, 加上 m 条边。
其中,C , D , E 可自行决定是否需要边权。
采用的随机数算法:梅森旋转(mt19937), 循环节为 2^19937 次。
目前只支持整数上的均匀分布
输出数据保存在 '输出.out' 文件中

点击查看代码
#include<bits/stdc++.h>
using namespace std;bool isInit;
int index;
int MT[624];  //624 * 32 - 31 = 19937void srand(int seed)
{index = 0;isInit = 1;MT[0] = seed;for(int i=1; i<624; i++){int t = 1812433253 * (MT[i-1] ^ (MT[i-1] >> 30)) + i;MT[i] = t & 0xffffffff;   //取最后的32位}
}void generate()
{for(int i=0; i<624; i++){// 2^31 = 0x80000000// 2^31-1 = 0x7fffffffint y = (MT[i] & 0x80000000) + (MT[(i+1) % 624] & 0x7fffffff);MT[i] = MT[(i + 397) % 624] ^ (y >> 1);if (y & 1)MT[i] ^= 2567483615;}
}int rand()
{if(!isInit)srand((int)time(NULL));if(index == 0)generate();int y = MT[index];y = y ^ (y >> 11);y = y ^ ((y << 7) & 2636928640);y = y ^ ((y << 15) & 4022730752);y = y ^ (y >> 18);index = (index + 1) % 624;return y;
}unsigned int rand4() { return rand() & 15; }template <typename T>
T random(T l, T r){typedef typename std::make_unsigned<T>::type U;U u = r - l, g = 15, w = 0;if(g == u) return l + rand4();if(g >  u){U eu = u + 1, s = g / eu, t = s * eu;do{w = rand4();}while(w >= t);w /= s;} else {U eg = g + 1, s = u / eg;do{w = random((U)0, s) * eg + rand4();}while(w >= u);}return l + w;
}char the_need;
/*
'A' means make some Integer sequence.
'B' means make some Interval's left and right.
'C' means make some tree.
'D' means make some picture.
*/void Integer_sequence() {int n, left_m, right_m;puts("请输入 n 的值:"); scanf("%d", &n);puts("请输入元素范围,保证 left <= right. "); scanf("%d%d", &left_m, &right_m);puts(""); freopen("输出.out", "w", stdout);int a[n + 1];memset(a, 0, sizeof a);for (int i = 1; i <= n; i++) {a[i] = random(left_m, right_m);}printf("%d\n", n);for (int i = 1; i <= n; i++) {printf("%d\n", a[i]);}
}void Interval_left_and_right() {int n, m;puts("请输入 n 的值:"); scanf("%d", &n);puts("请输入 m 的值:"); scanf("%d", &m);puts(""); freopen("输出.out", "w", stdout);printf("%d %d\n", n, m);for (int i = 1; i <= m; i++) {int l = random(1, n);int r = random(1, n);if (r < l) swap(l, r);printf("%d %d\n", l, r);}
}void tree() {int n, left_m, right_m;bool yes_or_no_of_val;puts("请输入 n 的值:"); scanf("%d", &n);puts("是否需要边权?");puts("Yes : 1"); puts("No : 0"); scanf("%d", &yes_or_no_of_val);if (yes_or_no_of_val) {puts("请输入边权范围,保证 left <= right. ");scanf("%d%d", &left_m, &right_m);}puts("");freopen("输出.out", "w", stdout);printf("%d\n", n);for (int i = 2; i <= n; i++) {int fa = random(1, i - 1);printf("%d %d", fa, i);if (yes_or_no_of_val) {int val = random(left_m, right_m);printf(" %d", val);}puts("");}
}void picture() {int n, m, left_m, right_m;bool yes_or_no_of_val;puts("警告:请遵守数据范围。");puts("请数据保持 5 <= n <= m <= n * (n - 1) / 4 <= 1e6 , 若溢出 m 自动等于上限");puts("请输入 n 的值:"); scanf("%d", &n);puts("请输入 m 的值:"); scanf("%d", &m);if (m > n * (n - 1) / 4 || m < n - 1) m = n * (n - 1) / 4; puts("是否需要边权?");puts("Yes : 1"); puts("No : 0"); scanf("%d", &yes_or_no_of_val);if (yes_or_no_of_val) {puts("请输入边权范围,保证 left <= right. ");scanf("%d%d", &left_m, &right_m);} puts("");freopen("输出.out", "w", stdout);pair < int , int > e[m + 1];map < pair < int , int > , bool > h;memset(e, 0, sizeof e);for (int i = 2; i <= n; i++) {int fa = random(1, i - 1);e[i - 1] = make_pair(fa, i);h[e[i - 1]] = h[make_pair(i, fa)] = 1;}for (int i = n; i <= m; i++) {int x, y;do {x = random(1, n);y = random(1, n);} while (x == y || h[make_pair(x, y)]);e[i] = make_pair(x, y);h[e[i]] = h[make_pair(y, x)] = 1;}random_shuffle(e + 1, e + m + 1);int val[m]; memset(val, 0, sizeof val);if (yes_or_no_of_val)for (int i = 1; i <= m; i++)val[i] = random(left_m, right_m);printf("%d %d\n", n, m);for (int i = 1; i <= m; i++) {printf("%d %d", e[i].first, e[i].second);if (yes_or_no_of_val) printf(" %d", val[i]);puts("");}	
}void chain() {int n, m, left_m, right_m;bool yes_or_no_of_val;puts("警告:请遵守数据范围。");puts("请数据保持 5 <= n <= m + n - 1 <= n * (n - 1) / 4 <= 1e6 , 若溢出 m 自动等于上限");puts("请输入 n 的值:"); scanf("%d", &n);puts("请输入 m 的值:"); scanf("%d", &m); m += n - 1;if (m > n * (n - 1) / 4 || m < n - 1) m = n * (n - 1) / 4;puts("是否需要边权?");puts("Yes : 1"); puts("No : 0"); scanf("%d", &yes_or_no_of_val);if (yes_or_no_of_val) {puts("请输入边权范围,保证 left <= right. ");scanf("%d%d", &left_m, &right_m);} puts("");freopen("输出.out", "w", stdout);pair < int , int > e[m + 1];bool vis[n + 1];map < pair < int , int > , bool > h;memset(e, 0, sizeof e);memset(vis, 0, sizeof vis);for (int i = 1; i < n; i++) {int x;do {x = random(1, n);} while (vis[x] || x == i || h[make_pair(x, i)]);vis[x] = 1;e[i] = make_pair(i, x);h[e[i]] = h[make_pair(x, i)] = 1;}for (int i = n; i <= m; i++) {int x, y;do {x = random(1, n);y = random(1, n);} while (x == y || h[make_pair(x, y)]);e[i] = make_pair(x, y);h[e[i]] = h[make_pair(y, x)] = 1;}random_shuffle(e + 1, e + m + 1);int val[m]; memset(val, 0, sizeof val);if (yes_or_no_of_val)for (int i = 1; i <= m; i++)val[i] = random(left_m, right_m);printf("%d %d\n", n, m);for (int i = 1; i <= m; i++) {printf("%d %d", e[i].first, e[i].second);if (yes_or_no_of_val) printf(" %d", val[i]);puts("");}	
} signed main() {puts ("数据生成器1.0"); puts ("所有生成数据均在输出.out文件中");puts ("—————————————————————");puts ("A:生成长度为 n 整数序列");puts ("B:生成 m 个 [1 , n] 的子区间");puts ("C:生成一颗 n 个节点的无向树");puts ("D:生成一幅 n 个节点, m 条边的无向图");puts ("E:生成一幅 n 个节点的链, 加上 m 条边"); scanf("%c", &the_need);if (the_need == 'A') Integer_sequence();if (the_need == 'B') Interval_left_and_right();if (the_need == 'C') tree();if (the_need == 'D') picture();if (the_need == 'E') chain();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/859998.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git review错误: is not registered in your account, and you lack forge committer permission

肉眼看上去,远端的邮箱和自己输入的邮箱是一致的 罪魁祸首是 git commit --amend 里面的邮箱带了中文引号,导致本地和远端邮箱名称不一致 从git review 命令报错email address那一行的奇怪字符可以看出端倪如上图所示,引号不是标准的linux字符

2.1基本选择器

选择器: 作用:选择页面上的某一个或者某一类元素 2.1基本选择器:1.标签选择器:选择一类标签 2.类选择器 class:选中所有class属性一致的标签(可以跨标签) .class名称{} 3.id选择器:id全局唯一 #id名称{} 不遵循就近原则:id>class>标签

痞子衡嵌入式:MCUXpresso for VS Code开发环境搭建及SDK工程导入

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是MCUXpresso for VS Code开发环境搭建及SDK工程导入。MCUXpresso IDE(包括其前身 LPCXpresso IDE、Kinetis Design Studio)是恩智浦软件团队持续开发了十多年的免费集成开发环境,现在功能已经相当完善,IDE…

3.选择器

选择器: 作用:选择页面上的某一个或者某一类元素 3.1基本选择器:1.标签选择器:选择一类标签 2.类选择器 class:选中所有class属性一致的标签(可以跨标签) .class名称{} 3.id选择器:id全局唯一 #id名称{} 不遵循就近原则:id>class>标签

2.CSS的三种导入方式

1.标签内部 2.head里面 3.css文件 1.链接式:html2.导入式:CSS2.1特有 优先级:行内样式>内部样式=外部样式(后导入的覆盖前导入的--就近原则)

谷歌Pixel 2 刷安卓10系统 APatch获取Root权限

事前准备手机需要解Bootloader锁 , 打开OEM解锁,开启USB调试链接电脑下载Platform-Tools # 地址 https://developer.android.google.cn/tools/releases/platform-tools?hl=zh-cn检查是否需要需要安装Android驱动刷机下载先刷机包 https://developers.google.cn/android/image…

六、汇编实战

打印:hello world 在屏幕上输出字符 mov dl,a ; 将要打印的字符放到dl中 mov ah, 02h ; 设置显示字符的功能号 int 21h ; 调用DOS中断,打印字符在屏幕上输出字符串 mov ah,09h ;设置显示字符串的功能号 int 21H …

可信执行环境

一、隐私计算与可信执行环境 1. 背景:随着云计算和大数据的普及,用户之间需要进行隐私数据的共享与协作,这些数据被上传到云端进行计算和处理。 但是,由于隐私数据交由不可信的第三方存储和管理,用户隐私数据面临被泄露的风险,公民的生命和财产安全乃至国家的安全都受到不…

Foldermove 轻松地把电脑里的软件搬到另一个硬盘,甚至是U盘里

Foldermove 大家好,今天我要介绍一个超实用的小工具,它能让你轻松地把电脑里的软件搬到另一个硬盘,甚至是U盘里,听起来是不是很酷? ●软件简介 软件名:FolderMove 体积:只有201kb,轻得像羽毛。 版本:v3.0 适用系统:Windows ●使用体验 这个小工具,体积小到几乎可以…

ping 工具的使用

一、ping基本使用详解在网络中ping是一个十分强大的TCP/IP工具。它的作用主要为:1、用来检测网络的连通情况和分析网络速度2、根据域名得到服务器IP3、根据ping返回的TTL值来判断对方所使用的操作系统及数据包经过路由器数量。 bytes值:数据包大小,也就是字节。 time值:响…

二维、三维组件融合 720三维全景沉浸式实景体验

本系统通过数字孪生技术,实现小区楼盘系统的可视化展示,整合楼盘内各个系统的数据源,将楼盘模型与房间模型、720三维全景图相结合,实现了从楼盘周边到室内布局的全方位展示,为购房者提供全方位的可视化信息。整个项目分为四个功能模块,分别为楼盘概览、楼盘规划、归家动线…

2024-2025-1 20241318 《计算机基础与程序设计》第十四周学习总结

这个作业属于哪个课程 https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP(这个作业要求在哪里 https://www.cnblogs.com/rocedu/p/9577842.html#WEEK14这个作业的目标 <学习《C语言程序设计》第13-14章并完成云班课测试>作业正文 https://i.cnblogs.com/posts/edi…