Re: generating random tuples in python
Robert Kern wrote: On 2009-04-20 23:04, per wrote: to be more formal by very different, i would be happy if they were maximally distant in ordinary euclidean space... so if you just plot the 3-tuples on x, y, z i want them to all be very different from each other. i realize this is obviously biased and that the tuples are not uniformly distributed -- that's exactly what i want... any ideas on how to go about this? Perhaps it would help if you told us what application you are going to use them for? Perhaps it's a glowworm arrangement problem: http://books.google.com/books?id=pzj90slTTEIC&printsec=frontcover#PPA267,M1 M -- http://mail.python.org/mailman/listinfo/python-list
Re: generating random tuples in python
[per] > i realize my example in the original post was misleading. i dont want > to maximize the difference between individual members of a single > tuple -- i want to maximize the difference between distinct tuples. in > other words, it's ok to have (.332, .334, .38), as long as the other > tuple is, say, (.52, .6, .9) which is very difference from (.332, . > 334, .38). i want the member of a given tuple to be arbitrary, e.g. > something like (rand(), rand(), rand()) but that the tuples be very > different from each other. No problem, just define a predicate that formalizes what you mean by "very different from each other". def generate_very_different_random_tuples(n): selected = set() for i in range(n): t = rand(), rand(), rand() while any(not very_different(t, s) for s in selected): t = rand(), rand(), rand() selected.add(t) return list(selected) Raymond -- http://mail.python.org/mailman/listinfo/python-list
Re: generating random tuples in python
On 2009-04-20 23:04, per wrote: to be more formal by very different, i would be happy if they were maximally distant in ordinary euclidean space... so if you just plot the 3-tuples on x, y, z i want them to all be very different from each other. i realize this is obviously biased and that the tuples are not uniformly distributed -- that's exactly what i want... any ideas on how to go about this? Perhaps it would help if you told us what application you are going to use them for? You can straightforwardly make a regular tetrahedral grid of points that fit in your box at whatever density you like. Which is more important: maximal (average) distance between neighbors or avoiding regularity? If you need to strike a balance between them, then you may want to look into low-discrepancy sequences: http://en.wikipedia.org/wiki/Low-discrepancy_sequence -- Robert Kern "I have come to believe that the whole world is an enigma, a harmless enigma that is made terrible by our own mad attempt to interpret it as though it had an underlying truth." -- Umberto Eco -- http://mail.python.org/mailman/listinfo/python-list
Re: generating random tuples in python
On Tue, 21 Apr 2009 07:53:29 +, Steven D'Aprano wrote: > Third strategy: divide the cube into eight half-cubes. Label then A > through H: Sheesh. Obviously they're not *half* cubes if there are eight of them. What I meant was that their edges are half as long as the edge of the 1x1x1 cube. -- Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: generating random tuples in python
On Mon, 20 Apr 2009 21:04:25 -0700, per wrote: > i realize my example in the original post was misleading. i dont want to > maximize the difference between individual members of a single tuple -- > i want to maximize the difference between distinct tuples. in other > words, it's ok to have (.332, .334, .38), as long as the other tuple is, > say, (.52, .6, .9) which is very difference from (.332, . 334, .38). i > want the member of a given tuple to be arbitrary, e.g. something like > (rand(), rand(), rand()) but that the tuples be very different from each > other. > > to be more formal by very different, i would be happy if they were > maximally distant in ordinary euclidean space... so if you just plot the > 3-tuples on x, y, z i want them to all be very different from each > other. i realize this is obviously biased and that the tuples are not > uniformly distributed -- that's exactly what i want... If you *really* mean "maximally distant", the maximal distance in a 1x1x1 cube is sqrt(3). Clearly you can't move sqrt(3) away in an arbitrary direction from an arbitrary point and remain inside the cube, but you could probably do something like this: * generate a random point (a, b, c); * work out what's the furthest you can go from there and still remain inside the cube; * return that point as the second point. Problem is that one out of every two points will be on the edge of the cube. This will be *seriously* biase, and obviously so. Here's another strategy: given the first point, generated randomly, reflect it around the centre point (0.5, 0.5, 0.5) in some plane to give the second point. You'll need to do some geometry to determine what plane to use. Disadvantage: the points will have a very strong symmetry. Third strategy: divide the cube into eight half-cubes. Label then A through H: A: 0.0 <= x <= 0.5, 0.0 <= y <= 0.5, 0.0 <= z <= 0.5 B: 0.5 < x <= 1.0, 0.0 <= y <= 0.5, 0.0 <= z <= 0.5 C: 0.0 <= x <= 0.5, 0.5 < y <= 1.0, 0.0 <= z <= 0.5 D: 0.5 < x <= 1.0, 0.5 < y <= 1.0, 0.0 <= z <= 0.5 (E, F, G, H are the same but with 0.5 < z <= 1.0) Generate a point in one half of the cube, A-D. If the point is in A, then the second point needs to be in H; if the first point is in B, the second should be in G; if the first point is in C, then generate your second point in F, and if in D, generate a point in E. This will give you points which are still random-ish, but on average they should be sqrt(3)/2 apart, which is probably about as far as you can reasonably expect. There will be some symmetry, *on average*, but individual points shouldn't have a mirror image (except by some fluke). -- Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: generating random tuples in python
On Apr 20, 11:04 pm, per wrote: > On Apr 20, 11:08 pm, Steven D'Aprano > > > > wrote: > > On Mon, 20 Apr 2009 11:39:35 -0700, per wrote: > > > hi all, > > > > i am generating a list of random tuples of numbers between 0 and 1 using > > > the rand() function, as follows: > > > > for i in range(0, n): > > > rand_tuple = (rand(), rand(), rand()) mylist.append(rand_tuple) > > > > when i generate this list, some of the random tuples might be very close > > > to each other, numerically. for example, i might get: > > [...] > > > how can i maximize the amount of "numeric distance" between the elements > > > of > > > this list, but still make sure that all the tuples have numbers strictly > > > between 0 and 1 (inclusive)? > > > Well, the only way to *maximise* the distance between the elements is to > > set them to (0.0, 0.5, 1.0). > > > > in other words i want the list of random numbers to be arbitrarily > > > different (which is why i am using rand()) but as different from other > > > tuples in the list as possible. > > > That means that the numbers you are generating will no longer be > > uniformly distributed, they will be biased. That's okay, but you need to > > describe *how* you want them biased. What precisely do you mean by > > "maximizing the distance"? > > > For example, here's one strategy: you need three random numbers, so > > divide the complete range 0-1 into three: generate three random numbers > > between 0 and 1/3.0, called x, y, z, and return [x, 1/3.0 + y, 2/3.0 + z]. > > > You might even decide to shuffle the list before returning them. > > > But note that you might still happen to get (say) [0.332, 0.334, 0.668] > > or similar. That's the thing with randomness. > > > -- > > Steven > > i realize my example in the original post was misleading. i dont want > to maximize the difference between individual members of a single > tuple -- i want to maximize the difference between distinct tuples. in > other words, it's ok to have (.332, .334, .38), as long as the other > tuple is, say, (.52, .6, .9) which is very difference from (.332, . > 334, .38). i want the member of a given tuple to be arbitrary, e.g. > something like (rand(), rand(), rand()) but that the tuples be very > different from each other. > > to be more formal by very different, i would be happy if they were > maximally distant in ordinary euclidean space... so if you just plot > the 3-tuples on x, y, z i want them to all be very different from each > other. i realize this is obviously biased and that the tuples are not > uniformly distributed -- that's exactly what i want... > > any ideas on how to go about this? > > thank you. Two ideas. One, start with a square grid and jitter the individual points by a small random amount. Two, start with one point, and move from it by a random large distance: a2= a1+ .5+ rand( ), then %1. -- http://mail.python.org/mailman/listinfo/python-list
Re: generating random tuples in python
per writes: > to be more formal by very different, i would be happy if they were > maximally distant in ordinary euclidean space... In that case you want them placed very carefully, not even slightly random. So you are making conflicting requests. -- http://mail.python.org/mailman/listinfo/python-list
Re: generating random tuples in python
per wrote: > >i am generating a list of random tuples of numbers between 0 and 1 >using the rand() function, as follows: >... >how can i maximize the amount of "numeric distance" between the >elements of this list, but still make sure that all the tuples >have numbers strictly between 0 and 1 (inclusive)? In doing so, you will be making the numbers non-random. Statistically speaking, a sufficiently long series of random numbers will often have short sequences that are very close to each other. -- Tim Roberts, t...@probo.com Providenza & Boekelheide, Inc. -- http://mail.python.org/mailman/listinfo/python-list
Re: generating random tuples in python
On Apr 20, 11:08 pm, Steven D'Aprano wrote: > On Mon, 20 Apr 2009 11:39:35 -0700, per wrote: > > hi all, > > > i am generating a list of random tuples of numbers between 0 and 1 using > > the rand() function, as follows: > > > for i in range(0, n): > > rand_tuple = (rand(), rand(), rand()) mylist.append(rand_tuple) > > > when i generate this list, some of the random tuples might be very close > > to each other, numerically. for example, i might get: > [...] > > how can i maximize the amount of "numeric distance" between the elements > > of > > this list, but still make sure that all the tuples have numbers strictly > > between 0 and 1 (inclusive)? > > Well, the only way to *maximise* the distance between the elements is to > set them to (0.0, 0.5, 1.0). > > > in other words i want the list of random numbers to be arbitrarily > > different (which is why i am using rand()) but as different from other > > tuples in the list as possible. > > That means that the numbers you are generating will no longer be > uniformly distributed, they will be biased. That's okay, but you need to > describe *how* you want them biased. What precisely do you mean by > "maximizing the distance"? > > For example, here's one strategy: you need three random numbers, so > divide the complete range 0-1 into three: generate three random numbers > between 0 and 1/3.0, called x, y, z, and return [x, 1/3.0 + y, 2/3.0 + z]. > > You might even decide to shuffle the list before returning them. > > But note that you might still happen to get (say) [0.332, 0.334, 0.668] > or similar. That's the thing with randomness. > > -- > Steven i realize my example in the original post was misleading. i dont want to maximize the difference between individual members of a single tuple -- i want to maximize the difference between distinct tuples. in other words, it's ok to have (.332, .334, .38), as long as the other tuple is, say, (.52, .6, .9) which is very difference from (.332, . 334, .38). i want the member of a given tuple to be arbitrary, e.g. something like (rand(), rand(), rand()) but that the tuples be very different from each other. to be more formal by very different, i would be happy if they were maximally distant in ordinary euclidean space... so if you just plot the 3-tuples on x, y, z i want them to all be very different from each other. i realize this is obviously biased and that the tuples are not uniformly distributed -- that's exactly what i want... any ideas on how to go about this? thank you. -- http://mail.python.org/mailman/listinfo/python-list
Re: generating random tuples in python
On Mon, 20 Apr 2009 11:39:35 -0700, per wrote: > hi all, > > i am generating a list of random tuples of numbers between 0 and 1 using > the rand() function, as follows: > > for i in range(0, n): > rand_tuple = (rand(), rand(), rand()) mylist.append(rand_tuple) > > when i generate this list, some of the random tuples might be very close > to each other, numerically. for example, i might get: [...] > how can i maximize the amount of "numeric distance" between the elements > of > this list, but still make sure that all the tuples have numbers strictly > between 0 and 1 (inclusive)? Well, the only way to *maximise* the distance between the elements is to set them to (0.0, 0.5, 1.0). > in other words i want the list of random numbers to be arbitrarily > different (which is why i am using rand()) but as different from other > tuples in the list as possible. That means that the numbers you are generating will no longer be uniformly distributed, they will be biased. That's okay, but you need to describe *how* you want them biased. What precisely do you mean by "maximizing the distance"? For example, here's one strategy: you need three random numbers, so divide the complete range 0-1 into three: generate three random numbers between 0 and 1/3.0, called x, y, z, and return [x, 1/3.0 + y, 2/3.0 + z]. You might even decide to shuffle the list before returning them. But note that you might still happen to get (say) [0.332, 0.334, 0.668] or similar. That's the thing with randomness. -- Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: generating random tuples in python
per writes: > hi all, > > i am generating a list of random tuples of numbers between 0 and 1 > using the rand() function, as follows: > > for i in range(0, n): > rand_tuple = (rand(), rand(), rand()) > mylist.append(rand_tuple) > > when i generate this list, some of the random tuples might be > very close to each other, numerically. for example, i might get: > > (0.553, 0.542, 0.654) > > and > > (0.581, 0.491, 0.634) > > so the two tuples are close to each other in that all of their numbers > have similar magnitudes. > > how can i maximize the amount of "numeric distance" between the > elements of this list, but still make sure that all the tuples have > numbers strictly between 0 and 1 (inclusive)? To solve your problem, you need to define quantitatively what your "numeric distance" is. > in other words i want the list of random numbers to be arbitrarily > different (which is why i am using rand()) but as different from other > tuples in the list as possible. > > thank you for your help -- Arnaud -- http://mail.python.org/mailman/listinfo/python-list
Re: generating random tuples in python
per: > in other words i want the list of random numbers to be arbitrarily > different (which is why i am using rand()) but as different from other > tuples in the list as possible. This is more or less the problem of packing n equal spheres in a cube. There is a lot of literature on this. You can use a simulated annealing to find good enough solutions. You just need 15 lines of code or less. But it's going to be slow if n is not very small. A fast language (or Psyco) is better for that. Bye, bearophile -- http://mail.python.org/mailman/listinfo/python-list
generating random tuples in python
hi all, i am generating a list of random tuples of numbers between 0 and 1 using the rand() function, as follows: for i in range(0, n): rand_tuple = (rand(), rand(), rand()) mylist.append(rand_tuple) when i generate this list, some of the random tuples might be very close to each other, numerically. for example, i might get: (0.553, 0.542, 0.654) and (0.581, 0.491, 0.634) so the two tuples are close to each other in that all of their numbers have similar magnitudes. how can i maximize the amount of "numeric distance" between the elements of this list, but still make sure that all the tuples have numbers strictly between 0 and 1 (inclusive)? in other words i want the list of random numbers to be arbitrarily different (which is why i am using rand()) but as different from other tuples in the list as possible. thank you for your help -- http://mail.python.org/mailman/listinfo/python-list