如何基于java中的模式生成随机数/字符串?

时间:2012-10-14 18:30:32

标签: java parsing random pattern-matching

我想基于如下模式生成一个随机数:

random.int= pattern="[0-9]{%len%}"   
random.big_integer= pattern="[0-9]{%len%}"  
random.long= pattern="[0-9]{%len%}"   
random.string= pattern="[A-Z][a-z]{0,%len%}"  
random.char= pattern="[A-Z]{1}"  
random.byte= pattern="[A-Z][0-9]{1}"  
random.short= pattern="[0-9]{%len%}"  
random.float= pattern="[0-9]{%len%}\\.[0-9]{%scl%}"  
random.double= pattern="[0-9]{%len%}\\.[0-9]{%scl%}"  
random.big_decimal= pattern="[0-9]{%len%}\\.[0-9]{%scl%}"  

所以,我的输入将是“len”,“scl”和数据类型。并基于这些输入, 我将不得不阅读相应的模式并生成输出。这个输出应该 在一次运行中每次通话都是随机的。如果我重新运行程序,输出应该相同。

在JAVA中我可以采取的最佳方法是什么?

例如,如果我调用generateRandomOutput(“float”,5,2)[datatype,length,scale]我的输出 应该有一个随机浮点数,例如:21453.67(这是基于上面描述的模式“random.float”)

5 个答案:

答案 0 :(得分:1)

简单地说,这是基础的变化。您可以通过获取Math.random并乘以26来生成随机字符,结果会告诉您字母表中随机字母的位置([A-Z])。

获取带有两个随机字符的字符串需要乘以26 ^ 2并将数字更改为26(或者,将随机数乘以26两次)。

答案 1 :(得分:1)

试用QuickCheck

它为您提供了很棒的primitive generators

答案 2 :(得分:0)

首先,您需要一个可以“播种”的随机数生成器,因此您可以在每次运行时提供相同的种子,以便运行可重现。你可以播种java.util.Random。

接下来,我建议你编写一个标准例程,给定长度和字母表,将提供一个包含许多随机字符的字符串。然后为每个数据类型编写例程以调用公共例程来获取字符串,并将它们转换为所需的类型。

标准例程非常简单:

  • 接收长度和字母表参数。

  • 从您的RNG获取下一个随机整数。

  • 取随机整数并计算字母表长度的模数。

  • 使用模数从字母表中选择下一个字符 - 将其推入结果字符串。

  • 重复,直到累积了指定数量的字符。

在类型特定的例程中,使用正确的parms调用上面的常用函数(两次,插入“。”,用于float / double / big decimal),然后使用Datatype.getDatatype(替换相应的数据类型名称)将结果字符串转换为正确的类型。因此,特定类型的例程主要是“样板”。

传递给公共例程的“字母”是“0123456789”数字类型,“ABCD..WXYZ”表示“char”类型,“ABCD..WXYZ0123..789”表示“字节”类型(或你打算将它作为“0123456789ABCDEF”吗?)。

答案 3 :(得分:0)

不可能确定所有符合正则表达式的可能字符串,只能确定一些简单的正则表达式。因此,我怀疑有一个图书馆可以帮助你。

我建议您使用更简单的格式,例如A => A-Z,a => a-z,d => 0-9,nnn表示重复,任何其他字符作为自身。

E.F。而不是

random.byte= pattern="[A-Z][0-9]{1}" 

我会

random.byte.pattern=Ad

解析起来要简单得多。

答案 4 :(得分:0)

  

如果我重新运行程序,输出应该相同。

听起来你真的不希望它随机

查看单向散列函数,如MD5,SHA等。