首页 > 其他分享 >数据生成器1.0

数据生成器1.0

时间:2024-12-27 19:31:23浏览次数:5  
标签:index 1.0 puts vis int make 生成器 MT 数据

开发日志:
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 = 19937

void 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 = 0x7fffffff
        int 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;
}

标签:index,1.0,puts,vis,int,make,生成器,MT,数据
From: https://www.cnblogs.com/cjyqaq/p/18636581

相关文章

  • 深入理解 MySQL 数据库的锁机制与索引使用
    1.请说说MySQL数据库的锁?MySQL数据库中的锁机制是用来管理对数据库资源的并发访问,确保数据的一致性和完整性。不同的存储引擎可能有不同的锁实现。以下是MySQL中主要的锁类型:表级锁(Table-LevelLocking):适用于MyISAM、MEMORY等存储引擎。包括读锁(共享锁)和写锁(排他......
  • 使用Stripe API加载数据到LangChain进行向量化处理
    老铁们,今天我们来探讨一下如何通过StripeAPI加载数据到LangChain中进行向量化处理。这波操作可以说是相当丝滑,特别是对于需要处理支付数据的项目来说,简直就是福音。##技术背景介绍Stripe是一个爱尔兰-美国的金融服务和SaaS公司,提供支付处理的软件和API接口,广泛应用于......
  • 如何使用IDEA随时随地访问公司或家里的数据库告别公网IP限制
    文章目录前言1.本地连接测试2.Windows安装Cpolar3.配置Mysql公网地址4.IDEA远程连接Mysql5.固定连接公网地址6.固定地址连接测试前言在快节奏的工作中,提升开发效率是每个程序员的心愿。今天我要分享一个超级实用的小技巧:如何使用IntelliJIDEA(简称IDEA)在家或......
  • 私募数据中心(数据解密,解密代码和教程)
    ==请帮忙点点赞,点个关注,谢谢!!==官网地址:私募数据中心本文发布的技术与代码仅供技术交流和学习使用,严禁用于数据采集等任何违法活动。请确保合法使用,并独立承担不当使用带来的法律责任。一、逆向教程1.我们先来看看返回的数据点下一页,有个请求返回了数据,data应该是我们想要......
  • Flink CDC MySQL 同步数据到 Kafka实践中可能遇到的问题
    FlinkCDCMySQL同步数据到Kafka实践中可能遇到的问题一、问题场景[ERROR]CouldnotexecuteSQLstatement.Reason:org.apache.flink.table.api.ValidationException:Theprimarykeyisnecessarywhenenable'Key:'scan.incremental.snapshot.enabled',defau......
  • 极狐可联动万能代扣V1.0台词升级版(不同步)成品说明书
    (特典代扣外壳改版本)一:代扣各触点功能解释(以特典代扣改为例):各触点编号(下同)插卡识别————————————(1号脚)组合/分离————————————(2号脚)触发变身/必杀————————(3号脚)功能键——————————————(4号脚)台词键—————————————......
  • 机器学习实战:以鸢尾花数据集分类问题为例
    在当今数据驱动的时代,机器学习已成为解决复杂问题的重要工具。本文将通过一个具体的分类问题——鸢尾花数据集(IrisDataset)的分类,展示如何在实际项目中应用机器学习。我们将使用Python编程语言,并借助流行的机器学习库scikit-learn来实现这一目标。文章将详细介绍数据预处理、模型......
  • KingbaseES V8R6数据库运维案例之---sys_resetwal案例
    案例说明:如下图所示,KingbaseESR6数据库启动失败,通过sys_resetwal重建checkpoint启动数据库。适用版本:KingbaseESV8R6一、问题现象二、问题分析1、查看reset前的控制文件的信息[kingbase@node1bin]$./sys_controldata-D/data/kingbase/v8r6_021/datasys_controlve......
  • Redis-十大数据类型
    Reids数据类型指的是value的类型,key都是字符串redis-server:启动redis服务redis-cli:进入redis交互式终端常用的key的操作redis的命令和参数不区分大小写,key和value区分1、查看当前库所有的keykeys*2、判断某个key是否存在existskey3、查看key是什么类型......
  • Kafka数据迁移全解析:同集群和跨集群
    文章目录一、同集群迁移二、跨集群迁移Kafka两种迁移场景,分别是同集群数据迁移、跨集群数据迁移。一、同集群迁移应用场景:broker迁移主要使用的场景是broker上线,下线,或者扩容等.基于同一套zookeeper的操作。实践:将需要新添加的broker列表一并添加到kafk......