由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 问个很基础的问题
相关主题
问一个 Andrei A. 的 Modern c++ design 书里边的一个问题问个bitwise实现加法的问题
[合集] 面试问题问个c++ struct的土问题
Shuffle performance (C#)问个技术问题: c++ 调试怎么显示二维数组?比如Visual Studio
求问一道数组shuffle的问题 (转载)问个best practice
[转载] Re: 问个土问题吧这儿专家多,问个杂志问题
[合集] 问个面试题[合集] 问个trick的Windows编程问题
问个小问题help understanding code (random number)
问个小问题Randomization of an array
相关话题的讨论汇总
话题: int话题: 100话题: random话题: index话题: swapindex
进入Programming版参与讨论
1 (共1页)
g**i
发帖数: 167
1
现在有从1到100这100个整数,每次随机从中抽取一个数,直至把这100个数全部抽出。
怎么十分高效地实现?
问题很初级,请各位表笑,还请赐教。谢谢!
P********e
发帖数: 2610
2
判断100个数全部都抽出是关键
搞4个unsigned int, 128bit中的前100个bit来代表, 0是没抽出,1是抽出
main()
{
unsigned int a[4] = {0,0,0,0};
while(a[0] != ~0 && a[1] != ~0 && a[2] != ~0 && a[3] != 31) {
int ran = rand()%100;
int q/*quotient*/ = ran/32-1;
int r/*remainder*/ = ran%32;
a[q] |= 1 << r;
}
}
I ran the code, it works.

【在 g**i 的大作中提到】
: 现在有从1到100这100个整数,每次随机从中抽取一个数,直至把这100个数全部抽出。
: 怎么十分高效地实现?
: 问题很初级,请各位表笑,还请赐教。谢谢!

c***c
发帖数: 21374
3
你要再多一些限制条件吧
比如这100个数是什么形式数据结构存储的
不同的结构可能结果不同
如果是linked list,每次取一个就把list的长度减1,100次就搞定了,O(N)
不能再快了吧?

【在 g**i 的大作中提到】
: 现在有从1到100这100个整数,每次随机从中抽取一个数,直至把这100个数全部抽出。
: 怎么十分高效地实现?
: 问题很初级,请各位表笑,还请赐教。谢谢!

c*****t
发帖数: 1879
4
很奇怪,我几个月前刚回答过该问题。很久以前也回答过,JHQ 里找不到 :(
这个题的基本思路就是 random index,而不 random 数值本身。
int index[100];
for (int i = 1; i <= 100; ++i)
index[i] = i;
for (int i = 0; i < 100; ++i)
{
int swapIndex = random (100 - i);
int t = index[i + swapIndex];
index[i + swapIndex] = index[i];
index[i] = t;
}

【在 g**i 的大作中提到】
: 现在有从1到100这100个整数,每次随机从中抽取一个数,直至把这100个数全部抽出。
: 怎么十分高效地实现?
: 问题很初级,请各位表笑,还请赐教。谢谢!

t****t
发帖数: 6806
5
这个问题基本上等价于把1-100做随机排列
搞得那么复杂, 难道你们都没看过精华区吗...

【在 P********e 的大作中提到】
: 判断100个数全部都抽出是关键
: 搞4个unsigned int, 128bit中的前100个bit来代表, 0是没抽出,1是抽出
: main()
: {
: unsigned int a[4] = {0,0,0,0};
: while(a[0] != ~0 && a[1] != ~0 && a[2] != ~0 && a[3] != 31) {
: int ran = rand()%100;
: int q/*quotient*/ = ran/32-1;
: int r/*remainder*/ = ran%32;
: a[q] |= 1 << r;

P********e
发帖数: 2610
6
晚上了,刚才跟一个经常污蔑中国的台湾白痴吵架,吵的脑子不清楚了
我理解成,一直抽,直到100个都抽出来,而不是从1-100中抽

【在 t****t 的大作中提到】
: 这个问题基本上等价于把1-100做随机排列
: 搞得那么复杂, 难道你们都没看过精华区吗...

t****t
发帖数: 6806
7
精华区23->13. 没有算法, 只有证明. 不过证明能看明白, 算法应该不成问题.

【在 c*****t 的大作中提到】
: 很奇怪,我几个月前刚回答过该问题。很久以前也回答过,JHQ 里找不到 :(
: 这个题的基本思路就是 random index,而不 random 数值本身。
: int index[100];
: for (int i = 1; i <= 100; ++i)
: index[i] = i;
: for (int i = 0; i < 100; ++i)
: {
: int swapIndex = random (100 - i);
: int t = index[i + swapIndex];
: index[i + swapIndex] = index[i];

k****f
发帖数: 3794
8
stl里面的random_shuffle

【在 g**i 的大作中提到】
: 现在有从1到100这100个整数,每次随机从中抽取一个数,直至把这100个数全部抽出。
: 怎么十分高效地实现?
: 问题很初级,请各位表笑,还请赐教。谢谢!

g**i
发帖数: 167
9
不好意思,你这个编译的时候怎么总报错啊?
#include
#include
#include
#include
int main()
{
....
return 0;
}
g++编译的时候总报说:
too many arguments to function `int random()'
怎么才能解决这个问题?
谢谢!

【在 c*****t 的大作中提到】
: 很奇怪,我几个月前刚回答过该问题。很久以前也回答过,JHQ 里找不到 :(
: 这个题的基本思路就是 random index,而不 random 数值本身。
: int index[100];
: for (int i = 1; i <= 100; ++i)
: index[i] = i;
: for (int i = 0; i < 100; ++i)
: {
: int swapIndex = random (100 - i);
: int t = index[i + swapIndex];
: index[i + swapIndex] = index[i];

t****t
发帖数: 6806
10
我没见到coconut教你用random()啊?
不要把责任推到人家头上

【在 g**i 的大作中提到】
: 不好意思,你这个编译的时候怎么总报错啊?
: #include
: #include
: #include
: #include
: int main()
: {
: ....
: return 0;
: }

相关主题
[合集] 问个面试题问个bitwise实现加法的问题
问个小问题问个c++ struct的土问题
问个小问题问个技术问题: c++ 调试怎么显示二维数组?比如Visual Studio
进入Programming版参与讨论
g**i
发帖数: 167
11
呵呵,我并没有推责任啊,我只是问问题而已。
况且,在他给我的源程序里有一句
int swapindex=random(100-i);
就是这句通不过啊。

【在 t****t 的大作中提到】
: 我没见到coconut教你用random()啊?
: 不要把责任推到人家头上

t****t
发帖数: 6806
12
哦,我看漏了,我的错.
他说的random(100-i)是个示意, 你应该翻译成你自己系统上正确的随机函数调用, 使
之产生0 ~ 100-i-1之间的均匀随机整数

【在 g**i 的大作中提到】
: 呵呵,我并没有推责任啊,我只是问问题而已。
: 况且,在他给我的源程序里有一句
: int swapindex=random(100-i);
: 就是这句通不过啊。

g**i
发帖数: 167
13
明白了,谢谢

【在 t****t 的大作中提到】
: 哦,我看漏了,我的错.
: 他说的random(100-i)是个示意, 你应该翻译成你自己系统上正确的随机函数调用, 使
: 之产生0 ~ 100-i-1之间的均匀随机整数

c*****z
发帖数: 182
14
this problem should be the same as an exercise in clrs
in which it asks to shuffle a deck of card

【在 c*****t 的大作中提到】
: 很奇怪,我几个月前刚回答过该问题。很久以前也回答过,JHQ 里找不到 :(
: 这个题的基本思路就是 random index,而不 random 数值本身。
: int index[100];
: for (int i = 1; i <= 100; ++i)
: index[i] = i;
: for (int i = 0; i < 100; ++i)
: {
: int swapIndex = random (100 - i);
: int t = index[i + swapIndex];
: index[i + swapIndex] = index[i];

p***o
发帖数: 1252
15
just use std::random_shuffle ... don't make wheels

【在 g**i 的大作中提到】
: 明白了,谢谢
I**********s
发帖数: 441
16
正在读Bentley的"More programming pearls". 这在column 13有详细讨论,
用的是Robert Floyd的算法.
如果有ACM digital library的帐号, 可以在这里下载column 13:
http://portal.acm.org/citation.cfm?doid=30401.315746
1 (共1页)
进入Programming版参与讨论
相关主题
Randomization of an array[转载] Re: 问个土问题吧
Random Switch Between Two Different URLs[合集] 问个面试题
科班不科班早都过时了问个小问题
g++ problem!!!!问个小问题
问一个 Andrei A. 的 Modern c++ design 书里边的一个问题问个bitwise实现加法的问题
[合集] 面试问题问个c++ struct的土问题
Shuffle performance (C#)问个技术问题: c++ 调试怎么显示二维数组?比如Visual Studio
求问一道数组shuffle的问题 (转载)问个best practice
相关话题的讨论汇总
话题: int话题: 100话题: random话题: index话题: swapindex