免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 4682 | 回复: 28

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

论坛徽章:
0
发表于 2016-04-19 20:19 |显示全部楼层
假如 :给定一个数a=200

然后开始不停产生小于 200的随机数,直到 这些随机数之和等于 a (产生的随机数之和不能大于或者小于a)

然后将这些随机数 存储于 数组中。

请教 大神们这个shell应该怎么去写。

论坛徽章:
0
发表于 2016-04-19 20:25 |显示全部楼层
本帖最后由 lmtwl 于 2016-04-19 20:56 编辑


  1. #!/bin/bash
  2. #set -x
  3. function rand(){
  4.     min=$1
  5.     max=$(($2-$min+1))
  6.     num=$(($RANDOM+1000000000))
  7.     echo $(($num%$max+$min))
  8. }
  9. j=100
  10. for ((i=0;j>0,j>30 ;i++  ));do
  11.     x[i]=$(rand 10 30)
  12.         j=`expr $j - ${x[i]}`
  13.         [ $j -lt 30 ] && { x[i+1]=$j ; }
  14. done

  15. for ((i=0;i<${#x[@]};i++));do

  16. echo ${x[i]}


  17. done

复制代码
代码真的很笨, 实现出来了,但是存在很大问题,假如我给定的数小于 随机数的最大范围的值的2倍,会出问题。

论坛徽章:
743
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
发表于 2016-04-19 20:47 |显示全部楼层
回复 1# lmtwl

第一次2,第二次199,程序结束?重新再来?
   

论坛徽章:
0
发表于 2016-04-19 20:52 |显示全部楼层
回复 3# Herowinter

回复 3# Herowinter

对。

最好的话 ,第一次参数2 ,第2次 产生了 199 ,就重新再产生 成198,第一次产生的不变动


   
   

论坛徽章:
0
发表于 2016-04-19 21:05 |显示全部楼层
回复 3# Herowinter


   

解决了那个问题。


#!/bin/bash
#set -x
function rand(){
    min=$1
    max=$(($2-$min+1))
    num=$(($RANDOM+1000000000))
    echo $(($num%$max+$min))
}
j=100
a=`expr $j / 2`
for ((i=0;j>0,j>$a ;i++  ));do
    x=$(rand 10 $a)
        j=`expr $j - ${x}`
        [ $j -lt $a ] && { x[i+1]=$j ; }
done

for ((i=0;i<${#x[@]};i++));do

echo ${x}


done

论坛徽章:
743
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
发表于 2016-04-19 21:12 |显示全部楼层
本帖最后由 Herowinter 于 2016-04-19 21:12 编辑

回复 4# lmtwl

不想用awk的话,应该可以改成shell的吧。
  1. echo|awk 'BEGIN{srand();max=target=200} {while(sum<target){r=int(rand()*200%max+1);sum+=r;if(sum>target){sum-=r;max=r-1}else a[++n]=r};for(i=1;i<=n;i++)print a[i]}'
  2. 129
  3. 7
  4. 1
  5. 40
  6. 15
  7. 3
  8. 3
  9. 1
  10. 1
复制代码

论坛徽章:
0
发表于 2016-04-19 21:14 |显示全部楼层
回复 6# Herowinter


    强,我整了那么多,你一句话就给我搞出来了

论坛徽章:
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
发表于 2016-04-19 23:18 |显示全部楼层
本帖最后由 sunzhiguolu 于 2016-04-19 23:21 编辑
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my ($sSum, @aNums) = (0);
  5. {
  6. RESTART:
  7.     push (@aNums, int rand 200);
  8.     $sSum += $_ for (@aNums);
  9.     if ($sSum != 200){
  10.         if ($sSum > 200){
  11.             splice (@aNums, -1);
  12.         }
  13.         $sSum = 0;
  14.         goto RESTART;
  15.     }
  16. }

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

论坛徽章:
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
发表于 2016-04-19 23:30 |显示全部楼层
本帖最后由 sunzhiguolu 于 2016-04-19 23:33 编辑
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my ($sSum, @aNums) = (0);
  5. until ($sSum == 200){
  6.     $sSum = 0;
  7.     push (@aNums, int rand 200);
  8.     $sSum += $_ for @aNums;
  9.     splice (@aNums, -1) if ($sSum > 200);
  10. }
  11. printf ("%d => {%s}\n",$sSum,join ('+', @aNums));
复制代码

论坛徽章:
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
发表于 2016-04-20 00:02 |显示全部楼层
本帖最后由 sunzhiguolu 于 2016-04-20 00:13 编辑

回复 1# lmtwl
1.> 如果生成的随机数恰巧比较小, 那么生成的随机数一定有非常多的重复. (如何避免生成重复的随机数, 总和依旧是 200)
2.> 如何控制总和是 200, 但生成的随机数的组成的个数.
3.> 补充一个, 能否控制按顺序生成随机数. 由大到小的随机数, 总和依旧是 200.
随便一问, .

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP