Rnd(100)的数据按档位进行靠位的算法.

ning1958 2010-07-03 10:56:55
nn是100的随机数.
当nn<2 -- nn = 2
4,5,10这些数道理同上,必须用Select case 方法

nn = Int(100)
Select Case nn
Case Is <= 10
nn = 10
Case 10.1 To 15
nn = 15
Case 15.1 To 20
nn = 20
Case 20.1 To 25
nn = 25
Case Else
End Select
请问各位大侠的问题是.
当nn >10 且 nn<=30时
进位档有15,20,25,30档,不用Select case方法.
当nn > 30 进位档有40,50,60,70,80,90.100
也就是没有45,55,65,75,85,95

谢谢各位大侠
...全文
301 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
ning1958 2010-07-04
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 vbman2003 的回复:]
GetValue函数中传二个参数,参数n就是你顶楼代码中的随机值nn, 参数m是进位值(5进位或10进位)... 
[/Quote]

谢谢,看错了,GetValue是自定义函数. 从这种写法以为是内置函数,在网上找了半天没找到,理解了半天没有理解到位,对不起了.谢谢指教.

Function GetValue(n As Double, m As Long) As Long
Dim x As Long
Dim y As Double
x = (n \ 10) * 10
y = n - x
If y > 0 And y <= m Then
y = m
ElseIf y > m Then
y = 10
End If
GetValue = x + y
End Function
ning1958 2010-07-04
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 chen8013 的回复:]
VB code
Sub Main()
Dim i&, j&
Randomize
For i = 1 To 20 '产生20个数进行测试
j = Rnd() * 100
Debug.Print j, ValueEx(j)
Next
End Sub

谢谢回复,又学到一个知识点.

Visual Basic 语言参考
\ 运算符--------将两个数相除并返回以整数形式表示的结果。

Mod 运算符 (Visual Basic)-------将两个数相除并只返回余数。

请问\与mod 有何区别---在这里为什么要用\ 而不用Mod.





vbman2003 2010-07-04
  • 打赏
  • 举报
回复
借用Chen8013的思路,好象如下就可以了吧:

Dim nn As Double
Dim x As Double
Dim y As Long

nn = rnd * 100
x = n / 5
Select Case x 'nn<=10
Case Is <= 2
nn = 10
Case 2 To 6 'nn=10~30
y = nn \ 5
nn = y * 5 - (x <> y) * 5 '非5倍数,整除5后再加5
Case Else: 'nn>30
x = nn / 10
y = nn \ 10
nn = y * 10 - (x <> y) * 10 ''非10倍数,整除10后再加10
End Select

舉杯邀明月 2010-07-04
  • 打赏
  • 举报
回复
这样测试更简单:
Sub Main()
Dim i&
For i = 1 To 100
Debug.Print i, ValueEx(i)
Next
End Sub

舉杯邀明月 2010-07-04
  • 打赏
  • 举报
回复
Sub Main()
Dim i&, j&
Randomize
For i = 1 To 20 '产生20个数进行测试
j = Rnd() * 100
Debug.Print j, ValueEx(j)
Next
End Sub

' 参数变换函数
Private Function ValueEx(ByVal num As Long) As Long
num = (num + 4) \ 5
If (num > 2) Then
If (num > 6) Then
ValueEx = ((num + 1) \ 2) * 10
Else
ValueEx = num * 5
End If
Else
ValueEx = 10
End If
End Function

chinaboyzyq 2010-07-03
  • 打赏
  • 举报
回复

Private Sub Command1_Click()
Dim nn As Integer, i As Integer
nn = 11
If nn > 10 And nn <= 30 Then
For i = 10 To 30 Step 5
If nn = i Then
MsgBox nn
Exit For
ElseIf nn < i Then
nn = i
MsgBox nn
Exit For
End If
Next
End If

'当nn >10 且 nn<=30时
'进位档有15,20,25,30档,不用Select case方法.
End Sub

ning1958 2010-07-03
  • 打赏
  • 举报
回复
5进位
当nn = 10.1 时 nn = 15
当nn = 17.2 nn =20

10进位
当nn = 35 时 nn = 40
当nn = 51.35 时 nn = 60
chinaboyzyq 2010-07-03
  • 打赏
  • 举报
回复
...
vbman2003 2010-07-03
  • 打赏
  • 举报
回复
GetValue函数中传二个参数,参数n就是你顶楼代码中的随机值nn, 参数m是进位值(5进位或10进位)... 
vbman2003 2010-07-03
  • 打赏
  • 举报
回复
7楼代码中GetValue是按你要求写的一个自定义函数,这也是常用方法....学编程你不会只想学for语句吧?for可不是万能的.......
ning1958 2010-07-03
  • 打赏
  • 举报
回复
谢谢回复
GetValue没有用过.

For i = 10 To 30 Step 5用法比较常用,便于理解.
vbman2003 2010-07-03
  • 打赏
  • 举报
回复
switch 改作select case :


Dim n As Double
Randomize
n = Rnd * 100
Debug.Print n
Select Case n
Case Is <= 10
n = 10
Case 10 To 30
n = GetValue(n, 5)
Case 30 To 100
n = GetValue(n, 10)
End Select
Debug.Print n
vbman2003 2010-07-03
  • 打赏
  • 举报
回复
大概想了下,应该还可以优化:


Function GetValue(n As Double, m As Long) As Long
Dim x As Long
Dim y As Double
x = (n \ 10) * 10
y = n - x
If y > 0 And y <= m Then
y = m
ElseIf y > m Then
y = 10
End If
GetValue = x + y
End Function


Private Sub Command1_Click()
Dim n As Double
Randomize
n = Rnd * 100
Debug.Print n
n = Switch(n <= 10, 10, _
n <= 30, GetValue(n, 5), _
n <= 100, GetValue(n, 10))
Debug.Print n
End Sub


也可以不用swith函数,用select case语句.....
ning1958 2010-07-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 chinaboyzyq 的回复:]
VB code

Private Sub Command1_Click()
Dim nn As Single, i As Integer
nn = 51.35
If nn > 10 And nn <= 30 Then
For i = 10 To 30 Step 5
If nn <= i Then
nn = ……
[/Quote]

发此帖时,个人的思路是
int(15/10 ) 得到一个倍数 --- nn =1
15.1- 10 * nn 判读其是否 > 5 还是 < 5 这种算法与Select case比 没有进行简单.
'一点没想到大侠的
For i = 10 To 30 Step 5
Step 5 的解法.

谢谢大侠的算法,简单明了,需要消化理解.


chinaboyzyq 2010-07-03
  • 打赏
  • 举报
回复

Private Sub Command1_Click()
Dim nn As Single, i As Integer
nn = 51.35
If nn > 10 And nn <= 30 Then
For i = 10 To 30 Step 5
If nn <= i Then
nn = i
MsgBox nn
Exit For
End If
Next
ElseIf nn > 30 Then
For i = 30 To 100 Step 10
If nn <= i Then
nn = i
MsgBox nn
Exit For
End If
Next

End If
'当nn >10 且 nn<=30时
'进位档有15,20,25,30档,不用Select case方法.

' 当nn > 30 进位档有40,50,60,70,80,90.100
'也就是没有45 , 55, 65, 75, 85, 95

End Sub

lb_bn 2010-07-03
  • 打赏
  • 举报
回复
帮顶一下。

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧