由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 今天的G电面面经
相关主题
关于那个随机数的请教个弱题:random generator: from 1~5 to 1~7
谁还记得这道面试题吗?srand()的问题
失败的Google Intern电面面经,并问找实习的心态请教一个随机数,概率相关的问题
一个面试题,不会做,大家看看请教一道产生随机数的问题
关于高德纳的洗牌算法G家onsite 随机数一题
问个随机数的问题问一个面试题
问个Shuffle的问题这道题在CC150或者leetcode上有吗?
how to shuffle a deck of cards?如果给随即函数rand[1,5] 如何产生rand[1,7]
相关话题的讨论汇总
话题: int话题: rand01话题: ret话题: while话题: rand
进入JobHunting版参与讨论
1 (共1页)
g********E
发帖数: 178
1
有一个只能产生0和1的随机函数,写一个能产生0到n-1的随机函数
F******F
发帖数: 63
2
先顶后看
j*****y
发帖数: 1071
3
bless
需要每个数的概率相等吗?

【在 g********E 的大作中提到】
: 有一个只能产生0和1的随机函数,写一个能产生0到n-1的随机函数
f****s
发帖数: 74
4
练一个,欢迎找错。
int rand(int n)
{
int re=0;
while(1){
int t=n;
re=0;
while(t){
re=(re<<1)+rand01();
t>>=1;
}
if(t return t;
}
}
f****s
发帖数: 74
5
显然需要啊。不需要的话我直接return 一个0就完了。

【在 j*****y 的大作中提到】
: bless
: 需要每个数的概率相等吗?

g********E
发帖数: 178
6
谢谢MM
是的,老题了,估计我就是传说中的“开胃菜吃成了主菜”,sigh

【在 j*****y 的大作中提到】
: bless
: 需要每个数的概率相等吗?

g********E
发帖数: 178
7
很简洁明了啊,赞
求问怎么才能练到这个水平?

【在 f****s 的大作中提到】
: 练一个,欢迎找错。
: int rand(int n)
: {
: int re=0;
: while(1){
: int t=n;
: re=0;
: while(t){
: re=(re<<1)+rand01();
: t>>=1;

f****s
发帖数: 74
8
mm羞煞我也。刚开始练leetcode,才练了两遍,离板上的大牛差的远了。

【在 g********E 的大作中提到】
: 很简洁明了啊,赞
: 求问怎么才能练到这个水平?

A**u
发帖数: 2458
9
其实不好写

【在 g********E 的大作中提到】
: 有一个只能产生0和1的随机函数,写一个能产生0到n-1的随机函数
g********E
发帖数: 178
10
真的吗,谢谢安慰。。
fanscs写的那个很好,其实思路挺简单的,结果让我写代码,我先紧张了估计有10分钟
,才终于get to the right track..

【在 A**u 的大作中提到】
: 其实不好写
相关主题
问个随机数的问题请教个弱题:random generator: from 1~5 to 1~7
问个Shuffle的问题srand()的问题
how to shuffle a deck of cards?请教一个随机数,概率相关的问题
进入JobHunting版参与讨论
d******e
发帖数: 164
11
int rand(int n)
{
while (true) {
int t = n, r = 0;
while (t) {
r = (r << 1) + rand01();
t >>= 1;
}
if (r < n) return r;
}
}

【在 f****s 的大作中提到】
: 练一个,欢迎找错。
: int rand(int n)
: {
: int re=0;
: while(1){
: int t=n;
: re=0;
: while(t){
: re=(re<<1)+rand01();
: t>>=1;

i****1
发帖数: 445
12
这样行不行?
int rand(int n)
{
int ret = 0;
while (1)
{
for (int i = 0; i < n; i++)
{
ret += rand01();
}
if (ret < n) return ret;
}
}

【在 g********E 的大作中提到】
: 有一个只能产生0和1的随机函数,写一个能产生0到n-1的随机函数
g********E
发帖数: 178
13
不行吧,
n=2,
1/4概率得到0,1/2概率得到1

【在 i****1 的大作中提到】
: 这样行不行?
: int rand(int n)
: {
: int ret = 0;
: while (1)
: {
: for (int i = 0; i < n; i++)
: {
: ret += rand01();
: }

r**h
发帖数: 1288
14
这个显然不行
sum of binomial distribution,显然不会是平均分布
(反过来如果N够大会趋向于高斯分布)
这题的思路其实就是,生成一个log n位的数,其每一位做一次随机数(0, 1)就好了。
如果结果大于n那么reject

【在 i****1 的大作中提到】
: 这样行不行?
: int rand(int n)
: {
: int ret = 0;
: while (1)
: {
: for (int i = 0; i < n; i++)
: {
: ret += rand01();
: }

j*****y
发帖数: 1071
15
nice.

【在 r**h 的大作中提到】
: 这个显然不行
: sum of binomial distribution,显然不会是平均分布
: (反过来如果N够大会趋向于高斯分布)
: 这题的思路其实就是,生成一个log n位的数,其每一位做一次随机数(0, 1)就好了。
: 如果结果大于n那么reject

n*******w
发帖数: 687
16
两个bug
t的初始值应该是n-1
返回的应该是re
其实最优解是从高位往低位generate,如果中间结果就已经大于等于n的话,直接
reject,从头开始。

【在 f****s 的大作中提到】
: 练一个,欢迎找错。
: int rand(int n)
: {
: int re=0;
: while(1){
: int t=n;
: re=0;
: while(t){
: re=(re<<1)+rand01();
: t>>=1;

b******7
发帖数: 92
17
还有一个bug,没有判断不合法输入,n<=0时会死循环

【在 n*******w 的大作中提到】
: 两个bug
: t的初始值应该是n-1
: 返回的应该是re
: 其实最优解是从高位往低位generate,如果中间结果就已经大于等于n的话,直接
: reject,从头开始。

z*******3
发帖数: 13709
18
循环n次
每一次判断0还是1
然后把n次循环结果加起来
这是0到n
1到n-1其实就是
1加上0到n-2次
所以最后结论应该是
循环n-2次,每一次判断0还是1
然后加起来,最后结果再加1
int r=1;
for(int i=0;i r = r + rand01();
return r;
u******g
发帖数: 89
19
你这是Binomial分布。。

【在 z*******3 的大作中提到】
: 循环n次
: 每一次判断0还是1
: 然后把n次循环结果加起来
: 这是0到n
: 1到n-1其实就是
: 1加上0到n-2次
: 所以最后结论应该是
: 循环n-2次,每一次判断0还是1
: 然后加起来,最后结果再加1
: int r=1;

J*****a
发帖数: 4262
20
这是典型错误啊 得到n-1的概率超小的

【在 z*******3 的大作中提到】
: 循环n次
: 每一次判断0还是1
: 然后把n次循环结果加起来
: 这是0到n
: 1到n-1其实就是
: 1加上0到n-2次
: 所以最后结论应该是
: 循环n-2次,每一次判断0还是1
: 然后加起来,最后结果再加1
: int r=1;

相关主题
请教一道产生随机数的问题这道题在CC150或者leetcode上有吗?
G家onsite 随机数一题如果给随即函数rand[1,5] 如何产生rand[1,7]
问一个面试题一个经典的随机数的问题。求教。
进入JobHunting版参与讨论
b*******l
发帖数: 590
21
这个不正是此类问题的考点吗。

【在 j*****y 的大作中提到】
: bless
: 需要每个数的概率相等吗?

y***i
发帖数: 8
22
int rand(int n) {
int ret = 0;
for(int i = 0; i < n; i++)
ret += rand01();
return ret % n;
}
l*****a
发帖数: 14598
23
不对
for example n=3
ret =0..7

【在 y***i 的大作中提到】
: int rand(int n) {
: int ret = 0;
: for(int i = 0; i < n; i++)
: ret += rand01();
: return ret % n;
: }

a********n
发帖数: 1287
24
不要循环到n吧。
shift n,直到0.

【在 i****1 的大作中提到】
: 这样行不行?
: int rand(int n)
: {
: int ret = 0;
: while (1)
: {
: for (int i = 0; i < n; i++)
: {
: ret += rand01();
: }

1 (共1页)
进入JobHunting版参与讨论
相关主题
如果给随即函数rand[1,5] 如何产生rand[1,7]关于高德纳的洗牌算法
一个经典的随机数的问题。求教。问个随机数的问题
Epic 店面被考到coding的题目。。。(面经)问个Shuffle的问题
c++中rand() 这个函数怎么实现的?how to shuffle a deck of cards?
关于那个随机数的请教个弱题:random generator: from 1~5 to 1~7
谁还记得这道面试题吗?srand()的问题
失败的Google Intern电面面经,并问找实习的心态请教一个随机数,概率相关的问题
一个面试题,不会做,大家看看请教一道产生随机数的问题
相关话题的讨论汇总
话题: int话题: rand01话题: ret话题: while话题: rand