CYaRon 文档(搬运自github)

CYaRon 文档(搬运自github)

CYaRon 是一个可以帮助你快速生成随机数据的工具库,目标是实现帮您5分钟内生成一组测试数据。

使用CYaRon

CYaRon 使用 Python 编写。在安装好 Python 的计算机上,下载 CYaRon 并放置在合适的目录下或使用 Python 自带的 pip 安装工具输入命令 pip install cyaron 即可安装 CYaRon。

CYaRon 的工具包可以帮助你写出 Python 数据生成器。通过使用各种工具包,你可以控制输入/输出文件,并将std程序(标程)的输出写入到输出文件中。

要了解 CYaRon 的使用,可以查看本项目的 examples

若您对 Python 不熟悉,可以查看快速入门教程

要详细了解 CYaRon 的各个部分,可通过下方的各链接跳转。(施工中……)

Python 30分钟快速入门

输入输出 IO

图 Graph

多边形 Polygon

向量 Vector

字符串 String

序列 Sequence

对拍器 Compare

工具函数

常用常数

数学函数(官网写着待补充……静等补充)

提高运行效率

数学相关

输入输出 IO

IO库可以方便的帮您建立一组测试数据。构造函数的调用方法有以下几种:

IO("test1.in", "test1.out") # test1.in, test1.out
IO(file_prefix="test") # test.in, test.out
IO(file_prefix="test", data_id=3) # test3.in, test3.out
IO(file_prefix="test", data_id=6, input_suffix=".input", output_suffix=".answer") # test6.input, test6.answer
IO("test2.in") # test2.in, .out文件生成为临时文件
IO(file_prefix="test", data_id=5, disable_output=True) # test5.in, 不建立.out
IO() # .in, .out文件均生成为临时文件,一般配合对拍器使用

以上方法可以帮您创建一组测试数据的文件。其中使用file_prefixdata_id配合for循环可以较为方便地批量生成多个数据点。

IO库的方法主要有以下几种:

io = IO("test1.in", "test1.out") # 先新建一组数据
io.input_write(1, 2, 3) # 写入1 2 3到输入文件
io.input_writeln(4, 5, 6) # 写入4 5 6到输入文件并换行
io.output_write(1, 2, 3) # 写入1 2 3到输出文件
io.output_writeln(4, 5, 6) # 写入4 5 6到输出文件并换行
io.input_write([1, 2, 3]) # 写入1 2 3到输入文件
io.output_write(1, 2, [1, 2, 3], [4]) # 写入1 2 1 2 3 4到输出文件
io.input_write(1, 2, 3, separator=',') # 写入1,2,3,到输入文件,目前版本尾部会多一个逗号,之后可能修改行为
io.output_gen("~/Documents/std") # 执行shell命令或二进制文件,把输入文件的内容通过stdin送入,获得stdout的内容生成输出
io.output_gen("C:\\Users\\Aqours\\std.exe") # 当然Windows也可以

向量 Vector

CYaRon的向量功能可以帮助您生成一个list,包括若干个向量。 在算法竞赛中,需要生成互不相同的坐标集,或者一组不重复的数列是很有用的。

用法:

Vector.random(num=5, position_range=[10], mode=0)
  • 参数 num:生成的向量个数。
  • 参数 position_range:一个list。内有几个元素那么就是输出几维向量。每个元素可以是一个二维整数(或实数)元组(min,max)表示每一维的取值是[min,max],也可以是可以是一个整数(或实数)k,则范围是[0,k]。当该参数只有一个元素时,则生成的是一组数列而不是向量
  • 参数 mode:模式选择。0为互相不重复的整数向量,1为允许出现重复的整数向量(各维完全独立随机),2为实数向量。

一些范例:

output = Vector.random()
#默认值,随机生成5个[0,10]的不重复数字的数列。

output = Vector.random(10, [(10,50)])
#生成10个范围在[10,50]之间的不重复数字数列。

output = Vector.random(30, [(10,50), 20])
#生成30个第一维范围[10,50]之间、第二维范围在[0,20]之间的不重复的二维向量。

output = Vector.random(30, [(1,10), (1,10), (1,10)], 2)
#生成30个每一维范围[1,10]之间的三维实数向量。

output = Vector.random(30, [10], 1)
#生成30个[0,10]之间的随机数,当然肯定会有重复咯。

在不使用pypy的情况下,生成一组1e5个unique的二维向量,坐标值不超过1e9,大约需要10秒钟。生成向量的算法均摊复杂度大于O(num),小于O(num*log(num))

默认情况下,即使是一维数列,每一项数字也是一个列表。例如 [[7], [110], [230], [415]],如果需要展平成一个一维 list,可以使用 sum(output,[])

字符串 String

String库可以帮您生成各种随机字符串、单词、句子、段落等。

使用方法如下:

str = String.random(5) # 生成一个5个字母的单词,从小写字母中随机选择
str = String.random((10, 20), charset="abcd1234") # 生成一个10到20个字母之间的单词,从abcd1234共8个字符中随机选择
str = String.random(10, charset="#######...") # 生成一个10个字母的只有'#'和'.'组成的字符串,'#'的可能性是70%,'.'可能30%。
str = String.random(None, charset=["foo", "bar"]) # 从foo、bar两个单词中随机选择一个返回
# charset参数对于以下所有指令也有效。

str = String.random_sentence(5) # 生成一个5个单词的句子,以空格分割,第一个单词首字母自动大写,结尾有句号或感叹号,每个单词3到8个字母长
str = String.random_sentence((10, 20), word_separators=",;", sentence_terminators=None, first_letter_uppercase=False, word_length_range=(2, 10), charset="abcdefg") # 生成一个10到20个单词的句子,以逗号或分号随机分割,第一个单词首字母不大写,结尾没有任何符号,每个单词2到10字母长,从abcdefg共7个字符中随机选择
# 以上所有参数,对于以下所有指令也有效

str = String.random_paragraph((3, 10)) # 生成一个3到10个句子的段落,句子之间以句号或感叹号分割,小句之间以逗号或分号分割,句子和小句结束后均接有一个空格,句子开头首字母大写而小句开头首字母不大写。生成句子的可能性为30%而小句的可能性为70%。
str = String.random_paragraph(6, sentence_joiners="|", sentence_separators=",", sentence_terminators=".?", termination_percentage=0.1) # 生成一个6个句子的段落,句子之间以句号或问号号分割,小句之间以逗号分割,句子和小句结束后均接有一个"|"号,句子开头首字母大写而小句开头首字母不大写。生成句子的可能性为10%而小句的可能性为90%。

# 注意:如果您需要以两个空格分割单词,应该使用如下写法:
str = String.random_sentence(5, word_separators=["  "]) # 以两个空格分割单词
# 而不是:
str = String.random_sentence(5, word_separators="  ") # 这会导致从两个空格中随机选择一个,也就是只有一个空格

序列 Sequence

Sequence是一个可以用来通过一个函数或者一个表达式,制造各种序列的东西。

使用方法如下面代码所示:

Sequence(lambda i, f: 2*i+1) # f(i)=2*i+1
Sequence(lambda i, f: f(i-1) + 1, [0, 1]) # f(i)=f(i-1)+1, f(0)=0, f(1)=1
Sequence(lambda i, f: f(i-1) + 1, {100: 101, 102: 103}) # f(i)=f(i-1)+1, f(100)=101, f(102)=103

其第一个参数为一个lambda函数,该lambda函数的第一个参数i代表这是序列的第几项,而第二个参数f则是一个可以获取该数列任意一项的函数。

第二个参数则是一个数组或dict,默认为空,是该序列的初始值列表。当这个序列的表达式中需要使用到f(即,需要递归进去获取函数值)的时候,必须提供第二个参数,否则找不到初始值会陷入死循环。

我们可以对其做如下操作:

seq = Sequence(lambda i, f: f(i-1) + 2, [0, 2, 4])
seq.get(3) # 6
seq.get(4, 6) # [8, 10, 12]
io.input_write(seq.get(7, 10)) # 可以直接传递给IO库,写入14 16 18 20

工具函数

CYaRon 提供了一些简单的工具函数。

  1. ati(array)

ati函数输入一个数组,将数组的每一个元素转换为整形数后返回。

因为Python的1E5此类表达式返回的是浮点值,因此使用这类表达式定义数据范围时,需要通过此函数处理数组。

  1. randint(n, m)

为标准库random.randint的别名。randint接受两个参数,生成[n, m]范围内(既,包含nm)的随机整数。

randint(1, 5) # int in [1, 5]
  1. randrange([n,]m[,step]

为标准库random.randrange的别名。请查看Python文档获取更多信息。

  1. uniform(n, m)

为标准库random.uniform的别名。uniform接受两个参数,生成[n,m]范围内(既,包含nm)的随机浮点数。

uniform(1, 5) # float in [1, 5]
  1. choice(seq)

为标准库random.choice的别名。choice从给定的数组中随机选取一个值返回。

choice([1, 2, 3])
  1. random()

为标准库random.random的别名。random返回[0, 1)范围内(既,包含0但不包含1)的随机浮点数。

random() # float in [0, 1)

常用常数

CYaRon 提供了一些常用的常数。

  1. PI

即圆周率的值。3.1415926...

  1. E

即自然底数的值。2.7182818...

  1. ALPHABET_SMALL

一个字符串,包含了所有的小写字母。abcdefghijklmnopqrstuvwxyz

  1. ALPHABET_CAPITAL

一个字符串,包含了所有的大写字母。ABCDEFGHIJKLMNOPQRSTUVWXYZ

  1. ALPHABET

一个字符串,包含了所有的字母。abcdefghijklmnopqrstuvwxyzABCDEFGHIJKMNOPQRSTUVWXYZ

  1. NUMBERS

一个字符串,包含所有的数字。"0123456789"

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值