使用 QuickCheck 生成随机字符串日期
Generate a random string-date with QuickCheck
我需要生成一个由空格分隔的名称-日期字符串,其中名称只是随机长度的字符,日期只是四个数字。例如:
"dfghjkl-1234 derftgyhjuik-5678"
目前我有这个解决方案:
genArgs :: Gen String
genArgs = do
cs <- listOf1 genCourse
return (unwords cs)
genCourse :: Gen String
genCourse = do
ns <- elements ["1111","1234","4567","1411","1284","4517"]
ls <- listOf1 $ elements ['a'..'z']
return (ls ++ "-" ++ ns)
但是我不得不对数字列表进行硬编码,因为其中一些必须重复(具有相同的数字),如果我只是随机选择它们,那么这样的事情就不太可能发生了:
"dfghjkl-1234 derftgyhjuik-5678 gyhujik-1234"
我想要的是生成一个随机的 4 位数字,然后该字符串的某些元素应该重复,比如 25% 的时间。我想这是通过频率实现的?
这是一次尝试。您可以从定义那些四位数 'dates':
的生成器开始
genDate :: Gen String
genDate = vectorOf 4 $ elements ['0'..'9']
接下来,给定 String
的函数将 return 生成 'courses':
genCourse :: String -> Gen String
genCourse ns = do
ls <- listOf1 $ elements ['a'..'z']
return (ls ++ "-" ++ ns)
为了实现 genArgs
功能,解决需求的一种方法是首先生成单个 date
,然后使用 frequency
来实现 return 那个随机生成的值,或者其他随机生成的日期:
genArgs :: Gen String
genArgs = do
date <- genDate
dates <- listOf1 $ frequency [(1, return date), (3, genDate)]
courses <- traverse genCourse dates
return $ unwords courses
四分之一由常数生成器return date
生成,四分之三由genDate
随机生成。
这会生成一个包含 'date' 个字符串的列表,然后您可以使用 genCourse
.
遍历该字符串
下面是一些示例值:
*Main Lib> sample genArgs
"u-8747"
"sd-2575 l-3069"
"rfn-1191 jbs-8962 kjtt-1909"
"ezbtrj-6167 t-3474 daaht-0834 puc-2266"
"epkbtz-8334 uj-8829 etu-9061 wkkro-5514 fque-4639 vgct-4572 daczohr-8683 zomo-5789"
"mkrnvyrjfu-6765 vunu-6869 xjd-1135 rkritwi-6869 odmvxec-4236 mirrfp-1715 jccla-0998 qyasxozuq-3713"
"cvyxjnvrqao-3675 rzsnkqplbv-3675 b-3675 ekchdgksbk-6463 nonz-3354 ue-3675 mwwoovthxusd-8882"
"vwffdntpwawo-4565"
"t-0278 dyauqxenubxjohr-7815 yvogox-5183 oz-4660 eufwzgabvo-3813 azetihbmuw-8622 tizuzbmacv-6102 tzqjz-9686 jsaaepngbi-7394 fzzpzykibohzf-7394 muhlolo-6770 tixpoi-7394 kqhvvw-5877 ulg-7394 ce-6817"
"y-3550 tfakitqwrhyrpu-6923 gwzpegkpxjn-7222 jkvuwsf-2819 il-2268 sfmxdh-0004 vqmalaisvtqtg-1759 acxn-3146 fuhwps-4534 rtqgqzndtjhiygan-3326 yktgeeww-2819 irtrpnh-0198 ghqs-2819 lofyzpejuzw-8408 hd-2647"
"kts-8877 kipbbttkzvopwkrmemsz-2158 xqblwsgdrhaupbfgg-0841 eminvqkvwl-9193 bjhzmafgnjyhdzuppar-9912 cg-7737 enjvjalpkstizymci-0039"
注意,例如 6869
在第六个值中重复了两次,而 3675
在第七个样本中重复了四次。
我需要生成一个由空格分隔的名称-日期字符串,其中名称只是随机长度的字符,日期只是四个数字。例如:
"dfghjkl-1234 derftgyhjuik-5678"
目前我有这个解决方案:
genArgs :: Gen String
genArgs = do
cs <- listOf1 genCourse
return (unwords cs)
genCourse :: Gen String
genCourse = do
ns <- elements ["1111","1234","4567","1411","1284","4517"]
ls <- listOf1 $ elements ['a'..'z']
return (ls ++ "-" ++ ns)
但是我不得不对数字列表进行硬编码,因为其中一些必须重复(具有相同的数字),如果我只是随机选择它们,那么这样的事情就不太可能发生了:
"dfghjkl-1234 derftgyhjuik-5678 gyhujik-1234"
我想要的是生成一个随机的 4 位数字,然后该字符串的某些元素应该重复,比如 25% 的时间。我想这是通过频率实现的?
这是一次尝试。您可以从定义那些四位数 'dates':
的生成器开始genDate :: Gen String
genDate = vectorOf 4 $ elements ['0'..'9']
接下来,给定 String
的函数将 return 生成 'courses':
genCourse :: String -> Gen String
genCourse ns = do
ls <- listOf1 $ elements ['a'..'z']
return (ls ++ "-" ++ ns)
为了实现 genArgs
功能,解决需求的一种方法是首先生成单个 date
,然后使用 frequency
来实现 return 那个随机生成的值,或者其他随机生成的日期:
genArgs :: Gen String
genArgs = do
date <- genDate
dates <- listOf1 $ frequency [(1, return date), (3, genDate)]
courses <- traverse genCourse dates
return $ unwords courses
四分之一由常数生成器return date
生成,四分之三由genDate
随机生成。
这会生成一个包含 'date' 个字符串的列表,然后您可以使用 genCourse
.
下面是一些示例值:
*Main Lib> sample genArgs
"u-8747"
"sd-2575 l-3069"
"rfn-1191 jbs-8962 kjtt-1909"
"ezbtrj-6167 t-3474 daaht-0834 puc-2266"
"epkbtz-8334 uj-8829 etu-9061 wkkro-5514 fque-4639 vgct-4572 daczohr-8683 zomo-5789"
"mkrnvyrjfu-6765 vunu-6869 xjd-1135 rkritwi-6869 odmvxec-4236 mirrfp-1715 jccla-0998 qyasxozuq-3713"
"cvyxjnvrqao-3675 rzsnkqplbv-3675 b-3675 ekchdgksbk-6463 nonz-3354 ue-3675 mwwoovthxusd-8882"
"vwffdntpwawo-4565"
"t-0278 dyauqxenubxjohr-7815 yvogox-5183 oz-4660 eufwzgabvo-3813 azetihbmuw-8622 tizuzbmacv-6102 tzqjz-9686 jsaaepngbi-7394 fzzpzykibohzf-7394 muhlolo-6770 tixpoi-7394 kqhvvw-5877 ulg-7394 ce-6817"
"y-3550 tfakitqwrhyrpu-6923 gwzpegkpxjn-7222 jkvuwsf-2819 il-2268 sfmxdh-0004 vqmalaisvtqtg-1759 acxn-3146 fuhwps-4534 rtqgqzndtjhiygan-3326 yktgeeww-2819 irtrpnh-0198 ghqs-2819 lofyzpejuzw-8408 hd-2647"
"kts-8877 kipbbttkzvopwkrmemsz-2158 xqblwsgdrhaupbfgg-0841 eminvqkvwl-9193 bjhzmafgnjyhdzuppar-9912 cg-7737 enjvjalpkstizymci-0039"
注意,例如 6869
在第六个值中重复了两次,而 3675
在第七个样本中重复了四次。