QuickCheck-Haskell(生成随机字符串日期)

时间:2018-08-30 02:15:27

标签: haskell quickcheck

我需要生成一个用空格分隔的名称-日期字符串,其中名称只是字符的随机长度,日期只有4个数字。例如:

“ dfghjkl-1234 derftgyhjuik-5678”

现在我有此解决方案:

btnNewButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) {
        String query="insert into employ values(?,?,?,?,?,?)";
    try {
        pst = con.prepareStatement(query);
        pst.setInt(1, Integer.parseInt(txtid.getText()));
        pst.setString(2, txtname.getText());
        pst.setString(3,txtlname.getText());
        pst.setString(4, gender);
        /*SimpleDateFormat formatter = new SimpleDateFormat("yyyy-mm-dd");
        Date dob = new Date();
        pst.setDate(5, (java.sql.Date) dob);*/
        pst.setString(5, ((JTextField) txtdate.getDateEditor().getUiComponent()).getText());
        pst.setInt(6, Integer.parseInt(txtage.getText()));
        pst.executeUpdate();
        if(result > 0){
            JOptionPane.showMessageDialog(null, "Data insert success");
        }else{
            JOptionPane.showMessageDialog(null, "Data insert failed");
        }
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    }
});

但是我不得不在数字列表中进行硬编码,因为其中一些必须重复(具有相同的数字),如果我只是随机选择它们,那么将不太可能具有类似的内容:

“ dfghjkl-1234 derftgyhjuik-5678 gyhujik-1234”

曾经发生。我想要的是生成一个随机的4位数字,然后该字符串的某些元素应该具有重复性,例如25%的时间。我想这是通过频率实现的?

1 个答案:

答案 0 :(得分:2)

这是一次尝试。您可以先定义一个四位数的“日期”生成器:

genDate :: Gen String
genDate = vectorOf 4 $ elements ['0'..'9']

接下来,给定String的函数将返回“课程”的生成器:

genCourse :: String -> Gen String
genCourse ns = do
  ls <- listOf1 $ elements ['a'..'z']
  return (ls ++ "-" ++ ns)

为了实现genArgs函数,一种解决要求的方法可能是首先生成一个date,然后使用frequency返回该随机生成的值,或其他随机生成的日期:

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将随机生成四分之三。

这将产生一个“日期”字符串列表,然后您可以使用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在第七个样本中重复了四次。