吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 14848|回复: 81
收起左侧

[原创工具] 随机数生成器

[复制链接]
倪沁东 发表于 2020-3-26 22:16
本帖最后由 倪沁东 于 2020-3-26 22:20 编辑

随机数生成器



最近遇到一个有趣的问题,我给大家分享下,希望能够得到指导。
目的:生成一组随机数(个数每次不同,可进行选择,比如20、30。。。。)
要求:已知该组随机数的平均值,根据已知的平均值、随机数的波动范围、随机数的数量、小数点位数生成一组随机数。




说明:我感觉上面那个要求已经说清楚了,如果看懂了就不用看这个说明了,我会在说明中再解释一遍,首先我已知一个平均数,这个平均数是我给定的,而不是实际计算得出的,所以我需要根据这个平均数模拟出一组随机数,这组随机数的平均值必须是我给定的那个数;并且在模拟出这组随机数的时候,我还对随机数的数量、波动范围(也就是不能离我的平均数太远,以免数据太假)、随机数的小数点位数(2位、3位。。。不过这个位数我认为不是关键要求,如果无法做到可以暂时不考虑)




备注:我把这个发出来的原因是我认为我现在想到的这个方法有点笨,想听一听大家的想法,希望能够得到大家的指导,希望大家能够畅所欲言,大家一起讨论下这个问题。






我的思路:
我希望大家不要先看我的思路,以免被我的笨办法带偏!
1、平均数已知,数量已知,则该组随机数的总和为平均数*数量(总和=平均数*数量);
2、首先利用随机数生成函数按照波动范围(上下限)生成第一个随机数,则剩下随机数之和(余量=总和-随机数[1]);
3、利用For循环生成(数量减一)个随机数,同时每生成一个随机数,则计算一次余量;比如我要得出10个随机数,则利用For循环生成9个符合要求的随机数,则最后的余量应该是我的最后一个数据;
4、因为我在生成随机数时,已经对上下限进行了限制,所以前9个数据肯定是符合我的要求的,但是余量就不一定了,所以我需要对余量进行判断,判断最后的余量也就是最后一个数据是否符合我的波动范围,如果不符合重来,符合则10个数据均满足我对数据的要求,输出即可。




可能哪里有表达的不清楚的地方,大家随意提问!


批注 2020-03-26 221607.png


下载链接:
https://www.lanzouj.com/iaoglxe
源码分享:
[C++] 纯文本查看 复制代码
#Region ;**** 参数创建于 ACNWrapper_GUI ****
#PRE_Compile_Both=y
#PRE_Res_requestedExecutionLevel=None
#EndRegion ;**** 参数创建于 ACNWrapper_GUI ****
#include <Date.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>


;~ #include <bug.au3>




#Region ### START Koda GUI section ### Form=e:\au3\project\随机数生成器\form1.kxf
$Form1_1 = GUICreate("Form1", 453, 172, 192, 124)
$Input1 = GUICtrlCreateInput("-0.5", 63, 72, 73, 21)
$Input2 = GUICtrlCreateInput("0.5", 207, 72, 73, 21)
$Input3 = GUICtrlCreateInput("3", 351, 72, 73, 21)
$Label1 = GUICtrlCreateLabel("下限:", 8, 74, 40, 17)
$Label2 = GUICtrlCreateLabel("上限:", 160, 75, 40, 17)
$Label3 = GUICtrlCreateLabel("小数位:", 295, 75, 52, 17)
;~ $Input4 = GUICtrlCreateInput("", 64, 118, 241, 21)
;~ $Label4 = GUICtrlCreateLabel("随机数:", 8, 120, 52, 17)
$Button1 = GUICtrlCreateButton("计算", 336, 104, 89, 41)
$Input5 = GUICtrlCreateInput("2", 65, 29, 73, 21)
$Input6 = GUICtrlCreateInput("20", 209, 29, 73, 21)
$Label5 = GUICtrlCreateLabel("平均数:", 10, 31, 52, 17)
$Label6 = GUICtrlCreateLabel("个数:", 162, 32, 40, 17)
$Label7 = GUICtrlCreateLabel("点击计算按钮开始吧!", 296, 30, 200, 30)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit
                Case $Button1
                        _suijishu()
        EndSwitch
WEnd





Func _suijishu()
        

        Local $rand, $yushu
        $yushu = GUICtrlRead($Input5) * GUICtrlRead($Input6)
        Local $num = 0
        While 1
                $num = $num + 1
                GUICtrlSetData($Label7, "正在进行第" & $num & "次尝试")
                If $yushu < (GUICtrlRead($Input2) + GUICtrlRead($Input5)) Then
                        If $yushu < (GUICtrlRead($Input1) + GUICtrlRead($Input5)) Then
                                $yushu = GUICtrlRead($Input5) * GUICtrlRead($Input6)
                                Local $file = FileOpen("test.txt", 10)
                                For $i = 1 To GUICtrlRead($Input6) - 1
                                        SRandom(StringReplace(_NowTime(), ":", "") + $i)
                                        $rand = Round(Random(GUICtrlRead($Input1) + GUICtrlRead($Input5), GUICtrlRead($Input2) + GUICtrlRead($Input5)), GUICtrlRead($Input3))
                                        FileWriteLine($file, $rand & @CRLF)
                                        $yushu = $yushu - $rand
                                Next
                        Else
                                ExitLoop
                        EndIf
                Else
                        $yushu = GUICtrlRead($Input5) * GUICtrlRead($Input6)
                        Local $file = FileOpen("test.txt", 10)
                        For $i = 1 To GUICtrlRead($Input6) - 1
                                SRandom(StringReplace(_NowTime(), ":", "") + $i)
                                $rand = Round(Random(GUICtrlRead($Input1) + GUICtrlRead($Input5), GUICtrlRead($Input2) + GUICtrlRead($Input5)), GUICtrlRead($Input3))
                                FileWriteLine($file, $rand & @CRLF)
                                $yushu = $yushu - $rand
                        Next
                        
                EndIf
        WEnd
        FileWriteLine($file, $yushu & @CRLF)
        GUICtrlSetData($Label7, "共进行了" & $num & "次尝试")
;~         MsgBox(0, 0, $yushu)
        FileClose($file)
EndFunc   ;==>_suijishu














随机数生成器.rar

897.02 KB, 下载次数: 311, 下载积分: 吾爱币 -2 CB

免费评分

参与人数 3吾爱币 +9 热心值 +3 收起 理由
liufenglei + 1 + 1 用心讨论,共获提升!
风之暇想 + 7 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
yixiqiao + 1 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 倪沁东 发表于 2020-3-29 11:04
男生1111 发表于 2020-3-27 14:39
其实这个MATLAB也能实现,不过将数据生成散点图就会发现数据看起来还是很假

您提到的这个问题,那天我想了一下,最后忘了回复您了,数据可能有点假,但是其实好像还可以,这个软件是应一个网友的要求写的,这个要求呢是我根据他的描述总结出来的,因为限制条件很简单,所以生成的数据可能也很有规律性,但是这个问题不是不能解决;
我对您【假】这个词的理解就是上面那样的,我的解决方案是是这样的:
首先用软件生成一组随机数,生成随机数之后,手动根据均值不变的原则进行调整,被调整的这几个数据可能超出波动范围,也就是我们说的【飞点】或者说【异常数据】,目前的话我的水平做不到这么的智能化,所以之后后期再手动进行一部分的调整,其实工具只是个工具,她是计算机软件,是很严谨的,可是实际的数据并没有那么的严谨,他并不会说是每一组数据都很好,所以一般情况下都会存在我说的【飞点】或者【异常数据】,不过这些异常数据的存在又都是合理的,因为实际的观测过程中总存在一定的误差,不管是人为的观测误差,还是由于设备本身的不稳定性导致的误差【非系统误差】,这样的数据可以通过对以往观测数据的总结,对生成的数据进行相应的改动。
举个例子:我每天观测10组数据,这10组数据中的9组可能都是在我的的波动范围之内的,总有一组跳出了我的波动范围,那我在利用软件生成数据的时候,我就手动进行调整,将某两组数据根据【均值不变】的原则进行调大或者调小,这样数据可能看起来就比较真实了。具体怎么用就得靠经验了
ciker_li 发表于 2020-4-1 22:33
本帖最后由 ciker_li 于 2020-4-1 22:34 编辑
倪沁东 发表于 2020-3-31 23:58
其实举个很简单的例子就能把我这个担心省去,我回完你帖子之后就在想这个问题,我发想并不是问题。

例 ...

1、超出范围问题
数据都大或者都小不是问题
容易出问题的是数据在两头分布。
比如平均值:2,数量10,小数位1,波动-0.5——0.5
数据是:
1.6,2.4,2.4,2.4,2.4,2.4,2.4,2.4,2.4,2.4
平均差(2*10-2.4*9-1.6)/10=-0.32
1.6-0.32 = 1.28   <1.5
我循环了10000次,大概有3000次会超出范围,30%的概率,所以应该进行范围判断。

2、 差值太小,数据假的问题
我觉得可能是一开始生成的随机数位数太少,
刚开始生成的随机数位数尽量多,先计算,最后在按位数要求近似
类似这样:
[Python] 纯文本查看 复制代码
1.5275958007789574
1.5607515700198415
1.6063309684790268
1.7033448430031592
1.7421156469914576
1.7975125117137627
1.8861354210366195
1.9092044654881726
1.937660077737733
1.9568697901161676
2.015524644213642
2.072603266782412
2.182124670365523
2.247956891033094
2.2547754324678637
2.2569886117620044
2.3094611032727728
2.3365006133025794
2.3370645815300164
2.3594790899052027
---------------------------------
1.528
1.561
1.606
1.703
1.742
1.798
1.886
1.909
1.938
1.957
2.016
2.073
2.182
2.248
2.255
2.257
2.309
2.337
2.337
2.359
yixiqiao 发表于 2020-3-26 22:44
 楼主| 倪沁东 发表于 2020-3-26 22:47

能满足你要求吗?

免费评分

参与人数 1吾爱币 +3 热心值 +1 收起 理由
yixiqiao + 3 + 1 大神收我一拜

查看全部评分

yixiqiao 发表于 2020-3-26 23:04
倪沁东 发表于 2020-3-26 22:47
能满足你要求吗?

这么多代码  你辛苦了
yixiqiao 发表于 2020-3-26 23:10
试了一下  完全满足要求
ckypamym119 发表于 2020-3-26 23:15
C++吗!!!
yixiqiao 发表于 2020-3-26 23:15
最大支持16位小数  你也太强了吧  我还说四五位都满足要求了   太感谢你了
硅谷神奇 发表于 2020-3-26 23:35
用EXCEL里面的函数公式可以实现,哪有楼主这么麻烦。
yixiqiao 发表于 2020-3-26 23:38
硅谷神奇 发表于 2020-3-26 23:35
用EXCEL里面的函数公式可以实现,哪有楼主这么麻烦。

这个确实比excel好用多了  不知道excel怎么写
 楼主| 倪沁东 发表于 2020-3-26 23:46

不是C++写的,用的是AU3写的,一个脚本语言
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 04:45

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表