使用一个罕见数字生成两个数字之间的随机数

Ron*_*ony 11 c random

我可以用c生成两个数字之间的随机数.

arc4random()%(high-low+1)+low;
Run Code Online (Sandbox Code Playgroud)

那么现在我的要求是......我想做一个罕见的数字....这意味着如果

高= 5,低= 1,稀有= 3,

超过3将很少出现1,2,4和5 ...

谢谢

Mer*_*ham 26

您可以使用表格来计算最终掷骰,类似于笔和纸RPG执行相同类型的计算:

滚动1 D 21(很可能是代码).

  • 如果你得到1-5,则算作1
  • 如果你得到6-10,则计为2
  • 如果你得到11-15,则计为4
  • 如果你得到16-20,则计为5
  • 如果你得到21,那就算是3

此选项的优点是您可以深入了解您正在处理的确切概率.您可以感觉到每个数字的确切罕见或常见,并且与其他数字相比,您可以细致地控制每个数字的常见程度.

您还可以使用分数来生成表格.使用最小公倍数确定公共基数.该基数是您需要的最大随机数.然后,用相同的术语表示所有分数.使用生成的分子来确定表中每个数字的范围大小.

使用这种自动化解决方案,输入数字相互之间非常容易理解.例如:

  • 1/4表示1
  • 1/4表示2
  • 1/4为4
  • 5点1/5
  • 1/20为3

这将生成一个如下表:

LCM = 20

  • 1-5 = 1(如条款 - 5/20)
  • 6-10 = 2(5/20)
  • 11-15 = 4(5/20)
  • 16-19 = 5(4/20)
  • 20 =(1/20)

关于LCM的更多内容:http://en.wikipedia.org/wiki/Least_common_multiple


Jon*_*eet 11

一个易于理解的选项:

  • 生成一个数字以确定您是否要返回罕见数字(例如,生成[0-99]范围内的数字,如果为0,则返回罕见数字
  • 如果你进入这一步,你将返回一个非稀有数字:继续生成正常范围内的数字,直到你获得任何非稀有数字,然后返回

还有其他替代方法只需要你生成一个数字,但上面的感觉就像是最简单的编写和理解.

  • 您不需要在第二步中重复生成数字,只需将范围减小一个,如果随机数> =稀有数,则递增它. (4认同)

zou*_*oul 5

您可以根据概率创建一个包含数字的数组:

list = (1, 1, 2, 2, 3, 4, 4, 5, 5);
return list.itemAtIndex(random() % list.count());
Run Code Online (Sandbox Code Playgroud)

这不是很优雅,但如果概率变得更复杂,它可以很容易地进行扩展.