diff options
author | Timothy Pearson <kb9vqf@pearsoncomputing.net> | 2013-01-26 13:17:43 -0600 |
---|---|---|
committer | Timothy Pearson <kb9vqf@pearsoncomputing.net> | 2013-01-26 13:17:43 -0600 |
commit | cb68a7857c80661d242ee5527ec6f99dc3f79fa7 (patch) | |
tree | a3b54203ca6bce0e8e1dc5107dc9653db246a281 /tdemid/randomlist.cpp | |
parent | 7534907d3759a8c520eeb9a701b316d891c63bdf (diff) | |
download | tdemultimedia-cb68a7857c80661d242ee5527ec6f99dc3f79fa7.tar.gz tdemultimedia-cb68a7857c80661d242ee5527ec6f99dc3f79fa7.zip |
Rename a number of libraries and executables to avoid conflicts with KDE4
Diffstat (limited to 'tdemid/randomlist.cpp')
-rw-r--r-- | tdemid/randomlist.cpp | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/tdemid/randomlist.cpp b/tdemid/randomlist.cpp new file mode 100644 index 00000000..f26b8cfc --- /dev/null +++ b/tdemid/randomlist.cpp @@ -0,0 +1,103 @@ +/************************************************************************** + + randomlist.cpp - Some "random functions" :-) + Copyright (C) 1997,98 Antonio Larrosa Jimenez + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + Send comments and bug fixes to larrosa@kde.org + or to Antonio Larrosa, Rio Arnoya, 10 5B, 29006 Malaga, Spain + +***************************************************************************/ +#include "randomlist.h" +#include <stdlib.h> +#include <stdio.h> + +#define RAND_UNIFORM (double)rand()/(double)RAND_MAX + +int random_discrete(double *distrib,int n) +{ + int i=0; + double g=0.0; + double z=0.0; + while ((z==0.0)||(z==1.0)) z=RAND_UNIFORM; + while ((g<z)&&(i<n)) + { + g+=distrib[i]; + i++; + }; + return i-1; +} + +double *generate_discrete_uniform_distrib(int n) +{ + double *distrib=new double[n]; + + for (int i=0;i<n;i++) + distrib[i]=1.0/(double)n; + + return distrib; +} + +void remove_lmn_from_discrete_distrib(int k,double *distrib,int n,int used=0) +{ + int i; + if (used==0) //guess how many values of the v.a. are strictly positive + { + for (i=0;i<n;i++) if (distrib[i]>0) used++; + }; + used--; // k will no longer be used :-) + if (used==0) return; + double piece=distrib[k]/(double)used; + distrib[k]=0.0; + for (i=0;i<n;i++) if (distrib[i]>0) distrib[i]+=piece; +} + +void show_distrib(double *distrib,int n) +{ + printf("("); + for (int j=0;j<n;j++) printf("%g,",distrib[j]); + printf(")\n"); +} + +int *generate_random_list(int n) +{ + if (n==0) return NULL; + int *list=new int[n]; + double *distrib=generate_discrete_uniform_distrib(n); + int used=n; + int x; + int i=1; + while (used>0) + { + x=random_discrete(distrib,n); + list[x]=i; + i++; + remove_lmn_from_discrete_distrib(x,distrib,n,used); + used--; + }; + delete distrib; + + return list; +} + +int *generate_list(int n) +{ + int *list=new int[n]; + for (int i=0;i<n;i++) + list[i]=i+1; + + return list; +} |