按概率生成随机数
来源:互联网 发布:编辑杂志的软件 编辑:程序博客网 时间:2024/05/14 01:23
版权声明:可以任意转载,转载时请务必以超链接形式标明如下文章原始出处和作者信息及本声明
作者:xixi
出处:http://blog.csdn.net/slowgrace/archive/2009/03/25/4022632.aspx
1、生成随机数的方法
Dim ref As String
Randomize
ref = Int((99999 - 10000) * Rnd + 10000)
SetEmpId = ref
End Function
This function’s purpose is to assign a unique five-digit number to each new employee. To generate a random integer between two given integers where ending_number = 99999 and beginning_number = 10000, the following formula is used:
= Int((ending_number - beginning_number) * Rnd + beginning_number)
2、按概率生成随机整数
以下参考:http://topic.csdn.net/t/20051018/10/4333135.html
如果要随机生成5个数,并控制它们出现的概率.
数字 概率
1 10%
2 10%
3 10%
4 20%
5 50%
那就生成0-1的随机数
0 -- 0.1 1
0.1 -- 0.2 2
0.2 -- 0.3 3
0.3 -- 0.5 4
0.5 -- 1.0 5
3、按概率生成随机浮点数
以下来自和Tiger_Zhao的讨论。
如果要控制1个数落在某个区间的概率,比如要求在sngBegin和sngEnd之间生成一个随机数,这个随机数落在sngPB和sngPE之间的概率是P%。有两种方法,以第二种方法为好。
先说第一种方法,要点是:
(1)由于sngPB和sngPE将整个区间分成3部分,所以先分别计算随机数落在3部分的概率。落在sngPB和sngPE之间的概率是P%,这是已知的。余下的两个区间的总和概率是(1-p%),分到各个区间的概率按它们的长度分成。
(2)然后根据3个概率得到一个区间划分,落在第一个区间的,就在sngPB和sngPE之间生成一个随机数;落在第二个区间的,就是[sngBegin, sngPB]里生成随机数;落在第3个区间的,就在[sngPE,sngEnd]之间生数。
'with a probability of bytP to lie within sngPB and sngPE
Public Function GetRndNumP(sngBegin As Single, sngEnd As Single, sngPB As Single, sngPE As Single, bytPAs Byte) As Single
Dim bytP1 As Byte, bytP2 As Byte
Debug.Assert (sngPB >= sngBegin) And (sngPE >= sngPB) And (sngEnd >= sngPE)
'计算其他区间的概率
bytP1 = ((sngPB - sngBegin) / ((sngEnd - sngBegin) - (sngPE - sngPB))) * (100 - bytP) '[sngBegin, sngPB]
bytP2 = 100 - bytP - bytP1 '[sngPE, sngEnd]
'依据概率投射到相应区间
Select Case GetRandomNum(1, 100)
Case 1 To bytP
GetRndNumP = GetRandomNum(sngPB, sngPE)
Case (bytP + 1) To (bytP + bytP1)
GetRndNumP = GetRandomNum(sngBegin, sngPB)
Case (bytP + bytP1) + 1 To 100
GetRndNumP = GetRandomNum(sngPE, sngEnd)
End Select
End Function
Randomize
GetRandomNum = (sngEnd - sngBegin) * Rnd + sngBegin
End Function
这个办法有个问题,就是用了两次随机数,这样实际上影响了它的随机性。Tiger_Zhao建议的第二种方法则没有这个问题,做法是:多个段有不同权重时其实可以映射成相同权重(缩放 [sngPB, sngPE] 区间,相对调整 sngEnd),这样只要一次 Rnd() 就可以完成,代码如下。
'with a probability of bytP to lie within sngPB and sngPE
Public Function GetRndNumP(sngBegin As Single, sngEnd As Single, sngPB As Single, sngPE As Single, bytPAs Byte) As Single
Dim sngPLen As Single
Dim sngTLen As Single 'total length
Dim sngIncreased As Single '需要缩放的长度
Dim sngResult As Single
sngPLen = sngPE - sngPB
sngTLen = sngEnd - sngBegin
Debug.Assert (sngPB >= sngBegin) And (sngPE >= sngPB) And (sngEnd >= sngPE)
Debug.Assert (bytP < 100) And (bytP > 0)
Debug.Assert sngTLen <> sngPLen
'映射原来的区间为等权重区间
If (sngPLen / sngTLen) * 100 = bytP Then
GetRndNumP = GetRandomNum(sngBegin, sngEnd)
Exit Function
End If
'((sngPLen + sngIncreased) / (sngTLen + sngIncreased)) * 100 = bytP
sngIncreased = ((bytP / 100) * sngTLen - sngPLen) / (1 - (bytP / 100))
'缩放回原来区间
sngResult = GetRandomNum(sngBegin, sngEnd + sngIncreased)
Select Case sngResult
Case sngBegin To sngPB
GetRndNumP = sngResult
Case sngPB To (sngPE + sngIncreased) '等比例缩放
GetRndNumP = sngPB + (sngResult - sngPB) * sngPLen / (sngPLen + sngIncreased)
Case (sngPE + sngIncreased) To sngEnd + sngIncreased '简单平移
GetRndNumP = sngResult - sngIncreased
End Select
End Function
另,yesvery说,VB产生的是伪随机数,不是真正的随机数。所以,不能完全满足正态分布。
- 按概率生成随机数
- python按概率生成随机数
- 概率、随机数、随机数生成函数
- 按概率生成随机数Java版本
- 按照概率生成随机数
- 概率条件下随机数的生成
- 随机数及按照概率生成随机数
- JAVA 生成随机数,并根据概率、比率
- 控制随机数生成概率的一种解决方法
- 等概率生成随机数问题解析
- JAVA 根据设置的概率生成随机数
- 控制随机数生成概率的一种解决方法
- JAVA 生成随机数,并根据概率、比率
- 【matlab】以一定的概率生成随机数
- 控制随机数生成概率的一种解决方法
- JAVA 根据概率生成的随机数
- JAVA 根据设置的概率生成随机数
- 概率、随机数、随机数生成函数(面试题)
- Windows phone 8 屏幕适配总结
- 从劫匪的行动来看同步、异步、阻塞、非阻塞
- Spring.Net+NHibenate+Asp.Net mvc +ExtJs 系列 1---准备
- 对计算机研究生的看法
- Linux下链接相互依赖的.a文件遇到undefined reference问题总结
- 按概率生成随机数
- ios nsdictionary
- Android中如何使用ViewPager实现类似laucher左右拖动效果
- Bash Shell中命令行选项/参数处理
- Memory management(ARM)
- SSH Secure Shell Client中文乱码的解决办法
- ASP.Net原理篇 之 cookie
- DirectX 9.0 C++ 教程 第一个程序
- Android开发者必须深入学习的10个应用开源项目