谷歌面试题:给定能随机生成整数1到5的函数,写出能随机生成整数1到7的函数

给定能随机生成整数1到5的函数,写出能随机生成整数1到7的函数。

我的想法:

编写一个生成0和1的随机函数: 
step1. 调用给定的随机函数original_rand()生成一个数 
如果==3 goto step1 
如果<3 return 0 
如果>3 return 1 
编写一个生成1到7的随机函数 
调用生成0和1的随机函数3次,构成000或001或010....... 
如果???不等于0返回,否则重新生成。

int rand_01()
{
   int r = original_rand();
   if(r == 3) return rand_01();
   if(r < 3) return 0;
   if(r > 3) return 1;
}

int rand_17()
{
   int i = 0;
   i += rand_01();
   i += rand_01() << 1;
   i += rand_01() << 2;
   if(i == 0) return rand_17();
   return i;
}

有网友提出这种思路:

产生K个数(k>1) 假定产生的数分别为n1,n2,n3,n4... 
那么定义产生的数为n1-1+(n2-2)*5+(n3-1)*5^2+(n4-1)*5^3........ 
于是产生的数位于区间(0,5^k-1) 
然后把5^k分成k等分,产生的数位于哪个等分就是那个产生的随机数(0~6),然后+1即可 
如果位于k等分的余数范围,则重新执行一次上述过程 
不用担心余数问题,当k取3时落到余数范围的概率就已经降低为6/125

也是可以参考的。

时间: 2024-10-02 21:41:32

谷歌面试题:给定能随机生成整数1到5的函数,写出能随机生成整数1到7的函数的相关文章

一个编程面试题,只要写出伪代码就可以了

问题描述 一个编程面试题,只要写出伪代码就可以了 假设有如下两个函数 rand3()可以产生随机的0 1 2,rand5()可以产生随机的0 1 2 3 4,现在请你利用它编写一个函数rand7(),产生0~6的随机数 解决方案 不是那么完美: int rand7() { int sum; switch(rand3()) { case 0: sum=rand5();//0,1,2,3,4 break; case 1: sum=rand5()+5;//5,6,7,8,9 break; case 2

java-在一个3x3的二维矩阵里面随机的用0或1填充,找出该矩阵里面的相同行或者列

问题描述 在一个3x3的二维矩阵里面随机的用0或1填充,找出该矩阵里面的相同行或者列 package exercise_7; public class Exercise7_10 { public static void main(String[] args) { int[][] test = new int[3][3]; for (int i = 0; i < test.length; i++) { for (int j = 0; j < test[i].length; j++) { int

javase-3x3的二维矩阵里面随机的用0或1填充,找出该矩阵里面的相同行或者列,没有输出

问题描述 3x3的二维矩阵里面随机的用0或1填充,找出该矩阵里面的相同行或者列,没有输出 package exercise_7; public class Exercise7_10 { public static void main(String[] args) { int[][] test = new int[3][3]; for (int i = 0; i < test.length; i++) { for (int j = 0; j < test[i].length; j++) { in

sql-ASP读取SQL数据表 生成多记录JSON 具体代码如何写 求教大神

问题描述 ASP读取SQL数据表 生成多记录JSON 具体代码如何写 求教大神 数据表是user 主键是m_Name <%response.ContentType=""text/json"" response.write request(""jsoncallback"")%>([{""m_Name"":""*依旧""n_Name&quo

C++通过自定义函数找出一个整数数组中第二大数的方法

  本文实例讲述了C++通过自定义函数找出一个整数数组中第二大数的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 const int MINNUMBER = -32767 ; //2字节的Int 0x8000-1, //4字节的Int 0x80000000-1 -2147483647 int find_sec_max( int data[] , int count) { int

用jfreechart生成图形报表在SSH中怎么写,

问题描述 用jfreechart生成图形报表在SSH中怎么写, http://lapulande.iteye.com/blog/847961 从网上找了一个普通的项目好使,然后放SSH就不知道怎么写了, 解决方案 public class BarChart { public static String getBarChart(HttpSession session) throws Exception{ 构造图片方法 action请求 public String bar(){ HttpSessio

我用SQL做数据库。在DATAGRID显示。我想用自动生成的编号进行删除。怎么写那个条件呀??

问题描述 我用SQL做数据库.在DATAGRID显示.我想用自动生成的编号进行删除.怎么写那个条件呀?? 解决方案 解决方案二:sf,?解决方案三:我用SQL做数据库.在DATAGRID显示.进行删除一行.怎么写那个条件呀??解决方案四:whereID=Datagrid.selectRows.cell[ID]解决方案五:...........解决方案六:我也想知道,正在找這方面的資料~~~~~解决方案七:该回复于2008-05-05 14:27:41被版主删除

编程语言-c#实现两个相差一千位以内的整数相加,写出这样一个方法并测试两个相差一百位以上的两个数,输出结果。

问题描述 c#实现两个相差一千位以内的整数相加,写出这样一个方法并测试两个相差一百位以上的两个数,输出结果. (如:111111111111111111111111111110 + 8 ) 解决方案 如果是.NET 4.0(VS2010),不需要写什么方法,直接调用BigIntegerhttps://msdn.microsoft.com/zh-cn/library/system.numerics.biginteger.aspx 解决方案二: 2000位的整数也不在话下,加减乘除都能做.

c++-用libpng生成一张背景透明上面有画出的墨迹的png图片

问题描述 用libpng生成一张背景透明上面有画出的墨迹的png图片 求大神指点12,小妹初来乍到,很是不懂啊 这个透明通道可以生成 但是墨迹就和背景一起透明了 怎么办π_π