VBA 用于计数的整数与长整数尝试检查随机数是否等于在 1 到 100 范围内选择的数字
VBA Integer vs Long for counting tries on check if random number is equal to picked number at a range of 1 to 100
上周我必须在 VBA 参加考试。我不得不编写一些代码 "game"。这些是规则:
- 选择一个介于 1 和 100 之间的数字(包括 1 和 100)
- 调用函数Randomize
- 生成一个介于 1 和 100 之间的随机数(包括 1 和 100)->
Int (100 * Rnd + 1)
- 检查随机数是否=选择的数字。
- 5.1 如果为真,计数器加+1,打印计数器,游戏结束
5.2 若为false,计数器加+1,返回步骤3
希望你能达到"game"的目的。
我将计数器初始化为整数(16 位)。我的老师告诉我,计数器可能会溢出。他建议使用Long(32位)这样溢出的机会就小了。
我告诉他,在柜台上尝试达到32000次几乎是不可能的,因为选择的数字等于生成的数字的机会是1:100。
他回复:不过还是可以的。
我的问题:
如果数据类型是整数,计数器是否可能溢出?如果有,机会有多大?如果不是,我该如何证明?
为什么这个问题是在 Whosebug 上而不是在统计上?
这很简单。因为你们知道幕后的 Rnd 函数和 VBA,统计人员却不知道。
从你上面的描述来看,似乎没有什么可以阻止代码尝试它之前已经尝试过的数字,所以理论上 long 没有帮助,它也可能溢出,即这可能会继续到无穷大
我以前用过这样的文件采样,带来的问题是一个字节足够(1-255)吗?
Public dicGeneratedAlready As Scripting.Dictionary
Public Function GENERATE_RANDOM(intFromNumber As Integer) As Integer
Randomize
If dicGeneratedAlready Is Nothing Then Set dicGeneratedAlready = New Scripting.Dictionary
GenerateRand:
GENERATE_RANDOM = Int((Rnd * intFromNumber) + 1)
If dicGeneratedAlready.Exists(CStr(GENERATE_RANDOM)) Then
GoTo GenerateRand
Else
dicGeneratedAlready.Add CStr(GENERATE_RANDOM), CStr(GENERATE_RANDOM)
End If
End Function
上周我必须在 VBA 参加考试。我不得不编写一些代码 "game"。这些是规则:
- 选择一个介于 1 和 100 之间的数字(包括 1 和 100)
- 调用函数Randomize
- 生成一个介于 1 和 100 之间的随机数(包括 1 和 100)->
Int (100 * Rnd + 1)
- 检查随机数是否=选择的数字。
- 5.1 如果为真,计数器加+1,打印计数器,游戏结束
5.2 若为false,计数器加+1,返回步骤3
希望你能达到"game"的目的。
我将计数器初始化为整数(16 位)。我的老师告诉我,计数器可能会溢出。他建议使用Long(32位)这样溢出的机会就小了。
我告诉他,在柜台上尝试达到32000次几乎是不可能的,因为选择的数字等于生成的数字的机会是1:100。
他回复:不过还是可以的。
我的问题:
如果数据类型是整数,计数器是否可能溢出?如果有,机会有多大?如果不是,我该如何证明?
为什么这个问题是在 Whosebug 上而不是在统计上?
这很简单。因为你们知道幕后的 Rnd 函数和 VBA,统计人员却不知道。
从你上面的描述来看,似乎没有什么可以阻止代码尝试它之前已经尝试过的数字,所以理论上 long 没有帮助,它也可能溢出,即这可能会继续到无穷大
我以前用过这样的文件采样,带来的问题是一个字节足够(1-255)吗?
Public dicGeneratedAlready As Scripting.Dictionary
Public Function GENERATE_RANDOM(intFromNumber As Integer) As Integer
Randomize
If dicGeneratedAlready Is Nothing Then Set dicGeneratedAlready = New Scripting.Dictionary
GenerateRand:
GENERATE_RANDOM = Int((Rnd * intFromNumber) + 1)
If dicGeneratedAlready.Exists(CStr(GENERATE_RANDOM)) Then
GoTo GenerateRand
Else
dicGeneratedAlready.Add CStr(GENERATE_RANDOM), CStr(GENERATE_RANDOM)
End If
End Function