免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
6
羊年新春福章
日期:2015-03-03 17:16:28双子座
日期:2015-03-03 17:16:56巳蛇
日期:2015-03-03 17:17:2415-16赛季CBA联赛之福建
日期:2016-03-11 09:05:00黑曼巴
日期:2016-07-07 16:58:1215-16赛季CBA联赛之吉林
日期:2016-11-14 09:23:07
11 [报告]
发表于 2016-04-20 09:29 |只看该作者
#!/usr/bin/env python
#_*_ coding:utf-8 _*_

import random

num = 0
stop_num = 200
while True:
    random_num = random.randint(0,200)
    num = num + random_num
    if num == stop_num:
        print '随机数之和为200'
        break
    if num > stop_num:
        num = num - random_num

求职 : 技术支持/维
论坛徽章:
0
12 [报告]
发表于 2016-04-20 09:59 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
13 [报告]
发表于 2016-04-20 14:47 |只看该作者
回复 10# sunzhiguolu



1、第一个问题很好解决,直接判断一次新产生的随机数跟已经产生的随机数相同,如果相同直接重新产生新的随机数再赋值给数组。

2、

3、 这个问题跟第一个问题一样,只需要判断下就重新产生随机数就行了。


第2个问题,这个我也不知道怎么去实现。控制随机数的个数。 希望大神们指点下
   

论坛徽章:
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
14 [报告]
发表于 2016-04-20 15:39 |只看该作者
  1. 来个python的

  2. #!/usr/env/bin python
  3. #!encoding=utf8

  4. import random
  5. import sys

  6. #避免生成重复的随机数
  7. flg = 1
  8. while flg:
  9.     sum = 200
  10.     l = []
  11.     while 1:
  12.         x = random.randint(1,200)
  13.         if x not in l:
  14.             l.append(x)
  15.         else:
  16.             continue
  17.         sum -= x
  18.         if sum <= 0:
  19.             if sum == 0:
  20.                 flg = 0
  21.             break
  22.    
  23. print l

  24. #制总和是 200, 且生成的随机数的组成的个数
  25. flg = 1
  26. if len(sys.argv) == 2:
  27.     num = int(sys.argv[1])
  28.     while flg:
  29.         sum = 200
  30.         l = []
  31.         while 1:
  32.             x = random.randint(1,200)
  33.             if len(l) > num:
  34.                 break
  35.             l.append(x)
  36.             sum -= x
  37.             if sum <= 0:
  38.                 if sum == 0 and len(l) == num:
  39.                     flg = 0
  40.                 break
  41.     print l

  42. #由大到小的随机数
  43. flg = 1
  44. while flg:
  45.     sum = 200
  46.     l = []
  47.     while 1:
  48.         x = random.randint(1,200)
  49.         if len(l) > 0:
  50.             if x == 1 and sum > x:
  51.                 break
  52.             if x >= l[len(l)-1]:
  53.                 continue
  54.         l.append(x)
  55.         sum -= x
  56.         if sum <= 0:
  57.             if sum == 0:
  58.                 flg = 0
  59.             break

  60. print l
复制代码

论坛徽章:
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
15 [报告]
发表于 2016-04-20 15:44 |只看该作者
  1. 来个python 的

  2. #!/usr/env/bin python
  3. #!encoding=utf8

  4. import random
  5. import sys

  6. #避免生成重复的随机数
  7. flg = 1
  8. while flg:
  9.     sum = 200
  10.     l = []
  11.     while 1:
  12.         x = random.randint(1,200)
  13.         if x not in l:
  14.             l.append(x)
  15.         else:
  16.             continue
  17.         sum -= x
  18.         if sum <= 0:
  19.             if sum == 0:
  20.                 flg = 0
  21.             break
  22.    
  23. print l

  24. #制总和是 200, 且生成的随机数的组成的个数
  25. flg = 1
  26. if len(sys.argv) == 2:
  27.     num = int(sys.argv[1])
  28.     while flg:
  29.         sum = 200
  30.         l = []
  31.         while 1:
  32.             x = random.randint(1,200)
  33.             if len(l) > num:
  34.                 break
  35.             l.append(x)
  36.             sum -= x
  37.             if sum <= 0:
  38.                 if sum == 0 and len(l) == num:
  39.                     flg = 0
  40.                 break
  41.     print l

  42. #由大到小的随机数
  43. flg = 1
  44. while flg:
  45.     sum = 200
  46.     l = []
  47.     while 1:
  48.         x = random.randint(1,200)
  49.         if len(l) > 0:
  50.             if x == 1 and sum > x:
  51.                 break
  52.             if x >= l[len(l)-1]:
  53.                 continue
  54.         l.append(x)
  55.         sum -= x
  56.         if sum <= 0:
  57.             if sum == 0:
  58.                 flg = 0
  59.             break

  60. print l
复制代码

论坛徽章:
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
16 [报告]
发表于 2016-04-20 15:54 |只看该作者
为什么我回不了贴, 回复后一刷新就没了?

论坛徽章:
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
17 [报告]
发表于 2016-04-20 16:13 |只看该作者
#!/usr/env/bin python
#!encoding=utf8

import random
import sys

#避免生成重复的随机数
flg = 1
while flg:
    sum = 200
    l = []
    while 1:
        x = random.randint(1,200)
        if x not in l:
            l.append(x)
        else:
            continue
        sum -= x
        if sum <= 0:
            if sum == 0:
                flg = 0
            break

print l

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-09-07 06:20:00程序设计版块每日发帖之星
日期:2015-09-07 06:20:00
18 [报告]
发表于 2016-04-20 16:19 |只看该作者
  1. #!/bin/sh
  2. #Sum=0
  3. #index=1
  4. declare -xa Array
  5. while :
  6. do
  7.   Random=$(expr `echo $RANDOM` / 1000)
  8.   if [ $Random -gt 200 ];then
  9.     continue
  10.   fi
  11.   if [ `expr $Sum + $Random` -gt 200 ];then
  12.     continue
  13.   elif [ `expr $Sum + $Random` -lt 200 ];then
  14.     Sum=$(($Sum+$Random))
  15.     Array[$i]=$Random
  16.     echo ${Array[$i]}
  17.     i=$((i+1))
  18.   else
  19.     Sum=$(($Sum+$Random))
  20.     Array[$i]=$Random
  21.     echo $Sum
  22.     break
  23.   fi
  24. done
复制代码

论坛徽章:
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
19 [报告]
发表于 2016-04-20 17:06 |只看该作者
发了个python的, 几次都没发出来, 改了个awk的
  1. !/bin/awk
  2. #避免生成重复的随机数
  3. BEGIN{
  4.     srand(systime())
  5.     while(1){
  6.         sum = 200
  7.         delete a
  8.         while(1){
  9.             x = int(rand()*10000%200)+1
  10.             if(!a[x])
  11.                 a[x]++
  12.             else
  13.                 continue
  14.             sum -= x
  15.             if(sum <= 0){
  16.                 if(sum == 0){
  17.                     for(i in a)
  18.                         printf i FS
  19.                     print ""
  20.                     exit
  21.                 }
  22.                 break
  23.             }
  24.         }
  25.     }
  26. }
复制代码

论坛徽章:
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
20 [报告]
发表于 2016-04-20 17:07 |只看该作者
  1. #总和是 200, 且生成的随机数的组成的个数
  2. BEGIN{
  3.     if(!num)
  4.         exit
  5.     srand(systime())
  6.     while(1){
  7.         sum = 200
  8.         delete a
  9.         n = 0
  10.         while(1){
  11.             x = int(rand()*10000%200)+1
  12.             if(n > num)
  13.                 break
  14.             a[++n] = x
  15.             sum -= x
  16.             if(sum <= 0){
  17.                 if(sum == 0 && n==num){
  18.                     for(i=1;i<=n;++i){
  19.                         printf a[i] FS
  20.                     }
  21.                     print ""
  22.                     exit
  23.                 }
  24.                 break
  25.             }
  26.         }
  27.     }
  28. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP