标题:没事就折腾一下,各位大大有没有写过一定范围内按比例出随机数?
只看楼主
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
回复 10楼 shonken
好象没见到那些:70%、10%、20%
2022-12-14 17:51
shonken
Rank: 2
等 级:论坛游民
帖 子:95
专家分:21
注 册:2017-1-15
得分:0 
回复 11楼 吹水佬
case那里,但好像不能准确表达自定义比例
2022-12-14 18:21
shonken
Rank: 2
等 级:论坛游民
帖 子:95
专家分:21
注 册:2017-1-15
得分:0 
弄成函数

程序代码:
Clea
nMin1 = 31&&比例1的最小值范围
nMax1 = 80&&比例1的最大值范围
nMin2 = 81
nMax2 = 100
nMin3 = 0
nMax3 = 30
nRang1 = 20 &&比例1
nRang2 = 10 &&比例2
?x_RandRang(nRang1,nMin1,nMax1,nRang2,nMin2,nMax2,nMin3,nMax3)

Function x_RandRang(nRang1,nMin1,nMax1,nRang2,nMin2,nMax2,nMin3,nMax3)
    nResult = 0
    lcResult = ""
    For i = 0 To 100
        nRang = Int((100 - 0 + 1) * Rand( ) + 0)
        Do Case
            Case nRang <= nRang1
                nResult = Int((nMax1 - nMin1 + 1) * Rand( ) + nMin1)
            Case Between(nRang,nRang1 + 1 ,nRang1 + nRang2)
                nResult = Int((nMax2 - nMin2 + 1) * Rand( ) + nMin2)
            Otherwise
                nResult = Int((nMax3 - nMin3 + 1) * Rand( ) + nMin3)
        Endcase
        lcResult = lcResult + Transform(nResult)+","
    Endfor
    Return lcResult
Endfunc

2022-12-14 18:41
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
占比不是这样子的吧
试将结果按占比要求统计一下
我看每次结果也不会一样
2022-12-14 19:52
sam_jiang
Rank: 8Rank: 8
等 级:贵宾
威 望:10
帖 子:542
专家分:781
注 册:2021-10-13
得分:0 
***改成函数吧,代码如下:***
***win7,foxpro9.0下编译通过***
myrand(30,80,99,70,10,20)
Function myrand
parameter num1,num2,num3,percent1,percent2,percent3
local x,y,z,cstr
store 0 to x,y,z
cstr=''
do while .t.
n=int(rand()*100)
if n<=num1
    x=x+1
    if x<=percent1
        cstr=cstr+transform(n)+';'
        loop
    endif
    loop
endif
if n<=num2
    y=y+1
    if y<=percent2
        cstr=cstr+transform(n)+';'
        loop
    endif
    loop
endif
if n<=num3
    z=z+1
    if z<=percent3
        cstr=cstr+transform(n)+';'
        loop
    endif
    if x>percent1 and y>percent2 and z>percent3
        exit&&确保完成任务再退出
    else
         loop
    endif
endif
enddo
?cstr
endfunc
***myrand(30,80,99, 70,10,20)***
***正好100个数***

[此贴子已经被作者于2022-12-16 14:43编辑过]

2022-12-15 00:19
DBFuser
Rank: 1
等 级:新手上路
帖 子:27
专家分:3
注 册:2022-12-15
得分:3 
如果搞彩票的这样干……
2022-12-15 23:25
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:396
帖 子:11713
专家分:43267
注 册:2006-5-13
得分:0 
5楼坛友的方法不错,思路更清晰!

活到老,学到老! http://www. E-mail:hu-jj@
2022-12-16 09:04
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
以下是引用hu9jj在2022-12-16 09:04:25的发言:

5楼坛友的方法不错,思路更清晰!

就是,既然可重复,直接随机抽够数就可以
2022-12-16 11:41
sam_jiang
Rank: 8Rank: 8
等 级:贵宾
威 望:10
帖 子:542
专家分:781
注 册:2021-10-13
得分:0 
回复 16楼 DBFuser
最佳应用场景是某某公司的年会抽奖环节,所谓的内定抽奖。
2022-12-16 14:37
sam_jiang
Rank: 8Rank: 8
等 级:贵宾
威 望:10
帖 子:542
专家分:781
注 册:2021-10-13
得分:0 
***逻辑顺序重新优化一下,用case...endcase估计可以更加有效率***
***感兴趣的可以再优化一下***
myrand(30,80,99, 70,10,20)
function myrand
parameters num1,num2,num3,percent1,percent2,percent3
local x,y,z,cstr
store 0 to x,y,z
cstr=''
clea
do while .t.
n=int(rand()*100)
if x>=percent1 and y>=percent2 and z>=percent3
    exit&&确保完成任务再退出
else
    if n<=num1
        x=x+1
        if x<=percent1
            cstr=cstr+transform(n)+';'
            loop
        endif
           loop
    endif
    if n<=num2
        y=y+1
        if y<=percent2
            cstr=cstr+transform(n)+';'
            loop
        endif
        loop
    endif
    if n<=num3
        z=z+1
        if z<=percent3
            cstr=cstr+transform(n)+';'
            loop
        endif
        loop
    endif
endif
enddo
?cstr
ENDFUNC
***myrand(30,80,99, 70,10,20)***
***正好100个数***
2022-12-16 19:43



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-510943-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.045206 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved