免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: lmtwl
打印 上一主题 下一主题

[数值计算] 给定一个数,不停产生随机数,直到产生的随机数之和等于给定的这个数 [复制链接]

论坛徽章:
29
程序设计版块每日发帖之星
日期:2016-02-29 06:20:0015-16赛季CBA联赛之天津
日期:2016-08-10 10:33:1115-16赛季CBA联赛之深圳
日期:2016-08-17 15:07:2015-16赛季CBA联赛之佛山
日期:2016-11-07 11:33:5015-16赛季CBA联赛之广夏
日期:2016-11-15 09:13:31CU十四周年纪念徽章
日期:2016-11-24 14:12:25极客徽章
日期:2016-12-07 14:03:4015-16赛季CBA联赛之深圳
日期:2016-12-07 17:15:2715-16赛季CBA联赛之北京
日期:2016-12-22 09:30:0115-16赛季CBA联赛之深圳
日期:2016-12-22 10:49:2115-16赛季CBA联赛之山西
日期:2017-02-10 09:05:3215-16赛季CBA联赛之同曦
日期:2017-02-27 14:19:08
21 [报告]
发表于 2016-04-20 17:08 |只看该作者
  1. #由大到小的随机数
  2. BEGIN{
  3.     srand(systime())
  4.     while(1){
  5.         sum = 200
  6.         delete a
  7.         n = 0
  8.         while(1){
  9.             x = int(rand()*10000%200)+1
  10.             if(n>0){
  11.                 if(x==1&&sum>x)
  12.                     break
  13.                 if(x>=a[n])
  14.                     continue
  15.             }
  16.             a[++n] = x
  17.             sum -= x
  18.             if(sum<=0){
  19.                 if(sum==0){
  20.                     for(i=1;i<=n;++i)
  21.                         printf a[i] FS
  22.                     print ""
  23.                     exit
  24.                 }
  25.                 break
  26.             }
  27.         }
  28.     }
  29. }
复制代码

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
22 [报告]
发表于 2016-04-20 17:34 |只看该作者
@lmtwl @sunzhiguolu

$ echo 200 | awk '{srand();while($1){r=int(rand()*$1)+1;$1-=r;printf r" "}print""}'
124 17 53 6

$ echo 200 | awk '{srand();while($1){r=int(rand()*$1)+1;$1-=r;printf r" "}print""}'
152 25 15 5 1 2

$ echo 200 | awk '{srand();while($1){r=int(rand()*$1)+1;$1-=r;printf r" "}print""}'
42 32 95 29 1 1

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
23 [报告]
发表于 2016-04-20 18:45 |只看该作者
本帖最后由 sunzhiguolu 于 2016-04-20 19:35 编辑

控制随机数的个数:
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. print "Input the number of digits please :";
  5. chomp (my $sNumber_of_digits = <STDIN>);
  6. my ($sSum, @aNumbers) = (0);
  7. until ($sSum == 200){
  8.     $sSum = 0;
  9.     push (@aNumbers, int (rand 200));
  10.     $sSum += $_ for @aNumbers;
  11.     if ($sSum != 200){
  12.         splice (@aNumbers, -1) if ($sSum > 200);
  13.     }else{
  14.         if (@aNumbers != $sNumber_of_digits){
  15.             splice (@aNumbers, ($sNumber_of_digits - 2)) if (@aNumbers > $sNumber_of_digits);
  16.             splice (@aNumbers, -1) if (@aNumbers < $sNumber_of_digits);
  17.             $sSum = 0;
  18.         }
  19.     }
  20. }

  21. printf ("%d => {%s}\n",$sSum,join (',',@aNumbers));
复制代码

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
24 [报告]
发表于 2016-04-20 18:50 |只看该作者
perl abc
----------------------------------------------------------
Input the number of digits please :5
200 => {124,47,11,15,3}

Input the number of digits please :7
200 => {15,144,13,4,19,3,2}

论坛徽章:
0
25 [报告]
发表于 2016-04-20 21:42 |只看该作者
回复 23# sunzhiguolu



perl 不会。

控制 产生随机数的个数,是怎么具体控制的?能不能通过shell 实现,perl 看不太明白


   

论坛徽章:
0
26 [报告]
发表于 2016-04-20 21:49 |只看该作者
大神些都在显圣手了lollol

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
27 [报告]
发表于 2016-04-20 22:41 |只看该作者
回复 25# lmtwl
如果条件 1 + 2 如何实现, .

   

论坛徽章:
0
28 [报告]
发表于 2016-04-27 12:55 |只看该作者
回复 27# sunzhiguolu


    第一个判断 避免产生相同的随机数,只需要在于循环内进行对已经生成的随机数进行比较,比较简单;
    第二个问题 限定产生的个数,我觉得可以用给定的数于产生随机数的个数求商,设定最小随机数的范围,直到产生完成,最后判断个数,如果大于设定个数值,将对于的值求和后,与除去这些最小值后的最小值求和,如果产生的随机数个数小于设定个数,将最大的随机数分成两个就行.




其实我最终实现的脚本不需要用的地方不需要这么多,这只是一部分
比如我脚本实现:

一个文件里面有很多的ip具体个数不固定,我需要whois去查询这些ip的运营商,一个个查询很慢,需要同时进行操作查询,我又不想分割文件等,只有把用函数来把这些ip分割后通过数组纪录的数开始多进程查询。

论坛徽章:
0
29 [报告]
发表于 2016-05-02 00:17 |只看该作者
好牛逼回复 6# Herowinter


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP