- 论坛徽章:
- 0
|
本帖最后由 pppStar 于 2010-03-02 11:29 编辑
好贴!
翻译 emacsnw 的算法为C实现以助兴!:)- #include <stdlib.h>
- #include <stdio.h>
- #include <time.h>
- static int* parray = NULL;
- static int arraysize = 0;
- double uniform01()
- {
- return ((double) rand() /(double) RAND_MAX) * 1 + 0;
- }
- void initset(int* pa, int asize)
- {
- int i =0;
- for(i = 0;i < asize;i++)
- {
- pa[i] = 0;
- }
- }
- void showset(int* pa, int asize)
- {
- int i =0;
- for(i = 0;i < asize;i++)
- {
- printf("%d ", pa[i]);
- if((i != 0) && ((i+1)%8 == 0))
- {
- printf("\n");
- }
- }
- printf("\n");
- }
- void addset(int* pa, int asize, int a)
- {
- int i =0;
- for(i = 0;i < asize;i++)
- {
- if(pa[i] == 0)
- {
- pa[i] = a;
- break;
- }
- }
- }
- void f(int c, int n)
- {
- double u = uniform01();
- int a = 0;
- if(c > 0 && n > 0)
- {
- if(c == 1 && n == 1)
- {
- addset(parray, arraysize, 1);
- }
- else
- {
- if(u < (double)((n*1.0)/(c*1.0)))
- {
- addset(parray, arraysize, c);
- f(c-1, n -1);
- }
- else
- {
- f(c-1, n);
- }
- }
- }
- }
- int main(int argc, char* argv[])
- {
- int c, n;
- printf("Plaese input C:");
- scanf("%d",&c);
- printf("\n");
- printf("Plaese input n:");
- scanf("%d",&n);
- printf("\n");
- parray = (int*)malloc(n*sizeof(int));
- arraysize = n;
- initset(parray, arraysize);
- srand( (unsigned)time( NULL ) );
- f(c,n);
- showset(parray, arraysize);
- free(parray);
- //system("pause");
- return 0;
- }
复制代码 附上一些rejection sample的文章,数学真的好难哦
random.rar
(967.79 KB, 下载次数: 58)
|
|