Java Forum / First Aid / March 2008
Math.random()
maya - 25 Feb 2008 21:39 GMT hi,
am trying to find out how to use random() method.. what is construction if, say, I want to generate a random no. betw. 1 and 100..
here, http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Math.html#random() it does not show how this method is used exactly (i.e., what construction is exactly... these detailed method-sections should show exact constructions/examples of how method is used..)
this method apparently takes no arguments, so how do you tell it in what range (betw what nos.) you want the random no. generated?
int randomNo = 0; randomNo = Math.random(a no. betw. 1 and 100...) // how do you do this????
AND: if I want to look up java tutorial on this, how do you search for class, method, etc.. you want here? http://java.sun.com/docs/books/tutorial/ (a few years ago I had a pg bookmarked in java.sun that was a huge index to all aspects of Java language, so all you had to do was search for term you wanted by doing ctrl-find on the browser (or scrolling down..) (also, this tutorial is for Java 6, do they still have tutorial for 1.5??)
thank you...
Stanimir Stamenkov - 25 Feb 2008 21:54 GMT Mon, 25 Feb 2008 16:39:42 -0500, /maya/:
> am trying to find out how to use random() method.. what is construction > if, say, I want to generate a random no. betw. 1 and 100.. [quoted text clipped - 5 lines] > randomNo = Math.random(a no. betw. 1 and 100...) // how do you do > this???? randomNo = Math.random() * 100 + 1;
As Math.random() returns a value greater than or equal to 0.0 and less than 1.0, multiplying it by 100 (or whatever upper bound) will return value greater than or equal to 0.0 and less than 100.0 (or the other upper bound chosen). Casting the result to an int will strip the fraction part so if you want a result of 0 to 100 inclusive you may simply multiply the Math.random() result by 101.
> AND: if I want to look up java tutorial on this, how do you search for > class, method, etc.. you want here? > http://java.sun.com/docs/books/tutorial/ At least you may try Google:
http://www.google.com/search?q=math+random+site%3Ajava.sun.com%2Fdocs%2Fbooks%2F tutorial%2F
(using a "site:java.sun.com/docs/books/tutorial/" (w/o the quotes) token in the query).
 Signature Stanimir
Roedy Green - 27 Feb 2008 11:06 GMT On Mon, 25 Feb 2008 23:54:49 +0200, Stanimir Stamenkov <s7an10@netscape.net> wrote, quoted or indirectly quoted someone who said :
>As Math.random() returns a value greater than or equal to 0.0 and >less than 1.0, multiplying it by 100 (or whatever upper bound) will >return value greater than or equal to 0.0 and less than 100.0 (or >the other upper bound chosen). Casting the result to an int will >strip the fraction part so if you want a result of 0 to 100 >inclusive you may simply multiply the Math.random() result by 101. That is not a good thing to do. See http://mindprod.com/jgloss/pseudorandom.html for why. Use random.nextInt( n ) instead. --
Roedy Green Canadian Mind Products The Java Glossary http://mindprod.com
maya - 25 Feb 2008 22:03 GMT > hi, > [quoted text clipped - 23 lines] > > thank you... what I actually want is to generate a LIST of nos, between 1 and a variable.. I found this way:
for (int i=1; i <= iPhotosL; i++) { out.println((int)(Math.random()*iPhotosL) + " -- random no.<br>"); }
however, I would like to tell it to NOT REPEAT a no. in the list, i.e., what I want is a list betw. 1 and a given no., but that no number appears more than once in the list.. is this possible??
(I want to have option of displaying photos in a random order instead of in order of img-names (1.jpg, 2.jpg, 3.jpg, etc..))
thank you very much..
Hal Rosser - 25 Feb 2008 22:22 GMT >> hi, >> [quoted text clipped - 39 lines] > > thank you very much.. Create a boolean array 0 to <your max value> and Each time you select a number - set the the array element that has that index to true but keep another variable for the count of how many you want - but only increment the count if the array element was false before you set it to true. Do the loop until the count equals the number you of picks you wanted. You're welcome
maya - 25 Feb 2008 22:24 GMT >>> hi, >>> [quoted text clipped - 45 lines] > Do the loop until the count equals the number you of picks you wanted. > You're welcome oh brother... I think get gist of what you're saying.. will try it....;) thank you very much.. (boolean array.... hmmm.. not sure if I've ever even seen code for a boolean array...;)
Lew - 26 Feb 2008 03:35 GMT > oh brother... I think get gist of what you're saying.. will try > it....;) thank you very much.. (boolean array.... hmmm.. not sure if > I've ever even seen code for a boolean array...;) package testit; import java.util.Random; import java.util.Set; import java.util.HashSet;
public class Scrambler { private final Random rand = new Random();
public Set <Integer> scrambleEggs( int upper, int count ) { Set <Integer> chosen = new HashSet <Integer> ( count * 4 / 3 + 1 ); boolean [] selected = new boolean [ upper ];
while ( count > 0 ) { int indx = rand.nextInt( upper ); if ( ! selected [ indx ] ) { if ( chosen.add( indx )) { --count; } selected [ indx ] = true; } } return chosen; } }
Untried, untested. (Pseudo-)Non-deterministic run time.
The bizarre reference to chosen.add()'s return value is a hint that one doesn't really need the boolean array if one is using a Set, in that Set guarantees uniqueness of its values with respect to equals(), and add() tells you if the item was not already in the Set. This could really help if 'upper' has a large value.
Things get trickier if you want multi-threaded use or a deterministic number of times through the loop.
 Signature Lew
Patricia Shanahan - 26 Feb 2008 03:55 GMT >> oh brother... I think get gist of what you're saying.. will try >> it....;) thank you very much.. (boolean array.... hmmm.. not sure if [quoted text clipped - 40 lines] > Things get trickier if you want multi-threaded use or a deterministic > number of times through the loop. Why have the boolean array at all? The technique only makes sense if upper is very large compared with count, so that the collision risk is very low, and in that case it is bad to have to create an array with upper elements. Here's a simplified, though still untested, version.
package testit; import java.util.Random; import java.util.Set; import java.util.HashSet;
public class Scrambler { private final Random rand = new Random();
public Set <Integer> scrambleEggs( int upper, int count ) { Set <Integer> chosen = new HashSet <Integer> ( count * 4 / 3 + 1 );
while ( chosen.size() < count ) { chosen.add(Integer.valueOf(rand.nextInt( upper )); } return chosen; } }
Testing chosen.size(), rather than counting add attempts, automatically deals with duplicates, because adding a duplicate does not increase the size of the Set.
Patricia
maya - 05 Mar 2008 19:33 GMT thank you all very much for yr responses.. actually I decided that instead of displaying the images at random in server (which means every time user comes back photos would be displayed in a different order, I'm not sure I want that) I want do do the following:
when photos first come in from memory card they are named thus:
DSC_0001.JPG, DSC_0002.JPG, DSC_0003.JPG, etc...
so instead of dislaying images at random in actual site I want to use random function when RENAMING images (locally, w/stand-alone class) before uploading them.. now I have written a class for this, thus:
import java.io.*;
public class Rename {
public static void main(String[] args) {
int posDot; String _temp = ""; String no = "";
// if no arg passed start naming of imgs @ "1" // else start at whatever no. is passed to class... if (null == args || args.length < 1) { no = "1"; } else { no = args[0]; } int iNo = Integer.parseInt(no);
File directory = new File(System.getProperty("user.dir")); String[] textFileNames = directory.list(new FilenameFilter() { public boolean accept(File dir, String name) { return name.endsWith(".JPG"); } });
for (int j=0; j < textFileNames.length+1; j++) { // System.out.print(textFileNames[j] + "\n"); }
for (int i = 0; i < textFileNames.length; ++i) { File oldFile = new File(textFileNames[i]); posDot = textFileNames[i].indexOf("."); _temp = textFileNames[i].substring(0,posDot); // System.out.print(_temp + "\n"); File newFile = new File(i+iNo + ".jpg"); oldFile.renameTo(newFile); } } }
(adapted from example I found here: http://www.zanthan.com/itymbi/archives/000805.html)
I would like to use random function to rename imgs at random (i.e., so instead of 1.jpg, 2.jpg, etc, in same order as orig's ones, I would like to do, say, name first img a number, 2nd image another number, but at random.. ) (reason sometimes I'll need to start renaming at @ no. diff from "1" is that in each dir I have imgs from one mem. card, and thus can have one img named DSC_0002.JPG in two diff folders b/c they came from diff cards, so can't just put all imgs from all cards in one folder.. so, after renaming, will have in 1st folder 1.jpg, etc.. thru, say, 15.jpg, then in second folder need to start at 16.jpg.. etc.. and if I want to shuffle among all imgs (not just imgs in one folder) I need to do this.. I hope this makes sense..)
thank you very much..
>> oh brother... I think get gist of what you're saying.. will try >> it....;) thank you very much.. (boolean array.... hmmm.. not sure if [quoted text clipped - 40 lines] > Things get trickier if you want multi-threaded use or a deterministic > number of times through the loop. Patricia Shanahan - 25 Feb 2008 23:03 GMT >>> hi, >>> [quoted text clipped - 45 lines] > Do the loop until the count equals the number you of picks you wanted. > You're welcome OK if you only want the first few results, but can get very inefficient if you need all or most of the numbers.
Patricia
RedGrittyBrick - 25 Feb 2008 23:59 GMT >>> hi, >>> [quoted text clipped - 45 lines] > Do the loop until the count equals the number you of picks you wanted. > You're welcome If you want integers 1-n in random order, I believe the usual procedure is to create an ordered array of n integers 1..n, then iterate through positions 1-n of the array and for each position generate a random number between the current position and n, swap the number at the current position with the number at the random position.
The above is far more efficient than repeatedly picking a random number and ignoring duplicates, because towards the end you are mostly picking duplicates. For small n I imagine this doesn't matter, other than aesthetically.
Lew - 26 Feb 2008 03:49 GMT > If you want integers 1-n in random order, I believe the usual procedure > is to create an ordered array of n integers 1..n, then iterate through > positions 1-n of the array and for each position generate a random > number between the current position and n, swap the number at the > current position with the number at the random position. It sounds like the OP is asking for something different: A collection of n unique numbers drawn from the range 0 to u (or equivalently, 1 to u + 1), u >= n-1. Order doesn't seem to matter.
But the OP also said:
> (I want to have option of displaying photos in a random order > instead of in order of img-names (1.jpg, 2.jpg, 3.jpg, etc..)) That means the OP can recast the *goal* to what RedGrittyBrick said. Present the n unique image names in a RandomAccess like ArrayList, or in an array. Now the OP's goal reduces to randomly ordering the n indexes into the RandomAccess, taken over the range 0 to n, not 1 to n + 1. Present the images from the RandomAccess in the random order generated by RedGrittyBrick's algorithm.
A classic case of recasting the tactic - picking random integers with no duplicates - to the goal - presenting a known list of images in random order - in order to find a better tactic - using the 0 to n (un)sorting algorithm.
 Signature Lew
Patricia Shanahan - 25 Feb 2008 22:51 GMT ....
> however, I would like to tell it to NOT REPEAT a no. in the list, i.e., > what I want is a list betw. 1 and a given no., but that no number > appears more than once in the list.. is this possible?? ....
I would load up an ArrayList, with the Integer numbers from 1 to N, and run Collections.shuffle on it.
Patricia
Daniel Pitts - 25 Feb 2008 23:11 GMT >> hi, >> [quoted text clipped - 40 lines] > > thank you very much.. Try putting the photos into a List object, and then calling Collections.shuffle() with that list object as the parameter.
 Signature Daniel Pitts' Tech Blog: <http://virtualinfinity.net/wordpress/>
Jeff Higgins - 25 Feb 2008 23:59 GMT >> (I want to have option of displaying photos in a random order instead of >> in order of img-names (1.jpg, 2.jpg, 3.jpg, etc..)) >> > Try putting the photos into a List object, and then calling > Collections.shuffle() with that list object as the parameter. A clear winner. :-))
maya - 07 Mar 2008 14:56 GMT >>> (I want to have option of displaying photos in a random order instead of >>> in order of img-names (1.jpg, 2.jpg, 3.jpg, etc..)) [quoted text clipped - 3 lines] >> > A clear winner. :-)) ok, am trying to do this now.. acc to docs it's like a vector except "synchronized" (not sure what this means..) only thing in Vector you add elements thus:
vPhotos.addElement(imgsList[i]);
but am having problems here:
ArrayList photos = new ArrayList();
File directory = new File(System.getProperty("user.dir")); String[] textFileNames = directory.list(new FilenameFilter() { public boolean accept(File dir, String name) { return name.endsWith(".jpg") || name.endsWith( ".JPG"); } }); for (int i=0; i < textFileNames.length+1; i++) { photos.add(i); // error here... }
how do I convert this "i" to an object (since this method takes only obj as argument..)
and then how do I apply Collections.shuffle() to it??
photos.Collections.shuffle() ?? I dont think so....;)
I really need this today, for some photos I'm putting together for a friend overseas, sending with a friend who travels today....
thank you very much..
maya - 07 Mar 2008 15:09 GMT >>>> (I want to have option of displaying photos in a random order >>>> instead of in order of img-names (1.jpg, 2.jpg, 3.jpg, etc..)) [quoted text clipped - 36 lines] > > thank you very much.. ok, I think got Collections.shuffle() part..
Collections.shuffle(photos, new Random());
only problem now is how to add all nos. to ArrayList (this has to be 1.4 construction, not 1.5..)
and then how to go from Collections.shuffle to this:
for (int i = 0; i < textFileNames.length; ++i) { File oldFile = new File(textFileNames[i]); posDot = textFileNames[i].indexOf("."); _temp = textFileNames[i].substring(0,posDot); File newFile = new File(i+1 + ".jpg"); oldFile.renameTo(newFile); }
so imgs are named with nos. at random (i.e., so imgs, after renamed, are in diff order from orig ones..)
thank you....
Jeff Higgins - 07 Mar 2008 16:06 GMT >>>>> (I want to have option of displaying photos in a random order instead >>>>> of in order of img-names (1.jpg, 2.jpg, 3.jpg, etc..)) [quoted text clipped - 21 lines] >> for (int i=0; i < textFileNames.length+1; i++) { >> photos.add(i); // error here... photos.add(new File(i));
>> } >> [quoted text clipped - 31 lines] > > thank you.... Jeff Higgins - 07 Mar 2008 16:28 GMT import java.io.File; import java.io.FilenameFilter; import java.util.ArrayList; import java.util.Collections;
public class ShuffleImages {
public static void main(String[] args) {
ArrayList photos = new ArrayList(); File directory = new File(System.getProperty("user.dir"));
String[] textFileNames = directory.list(new FilenameFilter() { public boolean accept(File dir, String name) { return name.endsWith(".jpg") || name.endsWith(".JPG"); } });
for (int i = 0; i < textFileNames.length; i++) {
photos.add(new File(textFileNames[i]));
}
Collections.shuffle(photos);
} }
maya - 07 Mar 2008 17:07 GMT > import java.io.File; > import java.io.FilenameFilter; [quoted text clipped - 24 lines] > } > } thank you very much.. I have incorporated this code into my class to rename files, it now looks thus, and get no compile or runtime errors, but it's still not doing it at random, i.e., what I want:
if I have: DSC_0184.JPG, DSC_0185.JPG, DSC_0186.JPG, DSC_0187.JPG, DSC_0188.JPG, DSC_0189.JPG, DSC_0190.JPG, DSC_0191.JPG, DSC_0192.JPG,
I want, for example: 8th img in this list to be called 1.jpg, 4nd img to be called 3.jpg, sixth image to be called 10.jpg, etc.. so once they are renamed they are ordered at random vis-a-vis orig order.. what I have now after incorporating yr code:
---------------
public class renameRandom {
public static void main(String[] args) {
int posDot; String _temp = ""; String no = "";
File directory = new File(System.getProperty("user.dir")); String[] textFileNames = directory.list(new FilenameFilter() { public boolean accept(File dir, String name) { return name.endsWith(".jpg") || name.endsWith( ".JPG"); } });
ArrayList photos = new ArrayList(); for (int i=0; i < textFileNames.length; i++) { photos.add(new File(textFileNames[i])); } Collections.shuffle(photos, new Random());
for (int i = 0; i < textFileNames.length; ++i) { File oldFile = new File(textFileNames[i]); posDot = textFileNames[i].indexOf("."); _temp = textFileNames[i].substring(0,posDot); File newFile = new File(i+1 + ".jpg"); oldFile.renameTo(newFile); } }
}
still trying to incorporate random "feature" into this renaming class..
maybe I need to modify this line?
File newFile = new File(i+1 + ".jpg");
so it when renaming imgs it goes thru the imgs at random instead of how they are ordered originally??
thank you very much..
maya - 07 Mar 2008 18:46 GMT >> import java.io.File; >> import java.io.FilenameFilter; [quoted text clipped - 82 lines] > > thank you very much.. so I figured after shuffling them I need to put them in an array.. yes?? so I now have:
ArrayList photos = new ArrayList();
for (int i=0; i < textFileNames.length; i++) { photos.add(new File(textFileNames[i])); } Collections.shuffle(photos, new Random());
String[] photosArr = new String[photos.size()]; photos.toArray(photosArr); // runtime error on this line..
for (int i = 0; i < photosArr.length; ++i) { File oldFile = new File(photosArr[i]); posDot = photosArr[i].indexOf("."); _temp = photosArr[i].substring(0,posDot); File newFile = new File(i+1 + ".jpg"); oldFile.renameTo(newFile); }
it compiles fine, but get a runtime error, thus:
Exception in thread "main" java.lang.ArrayStoreException at java.lang.System.arraycopy(Native Method at java.util.ArrayList.toArray(Unknown Sour at renameRandom.main(renameRandom.java:40)
line 40 is: photos.toArray(photosArr);
( I looked up ArrayList in docs, it looks like it can be converted to an array in same way as Vector can, and I have done it w/Vector before..)
thank you..
Lew - 08 Mar 2008 04:32 GMT > so I now have: > > ArrayList photos = new ArrayList(); If you used generics you'd see that this is a List <File>, not a List <String>.
> for (int i=0; i < textFileNames.length; i++) { > photos.add(new File(textFileNames[i])); > } > > Collections.shuffle(photos, new Random()); You don't really need a new Random().
> String[] photosArr = new String[photos.size()]; > photos.toArray(photosArr); // runtime error on this line.. Because you're trying to jam a bunch of Files into an array of String.
> it compiles fine, Because you don't use generics. With generics you'd have had an error and you'd know why it didn't work.
> but get a runtime error, thus: > Exception in thread "main" java.lang.ArrayStoreException > line 40 is: photos.toArray(photosArr); And now you know.
 Signature Lew
maya - 10 Mar 2008 17:45 GMT >> so I now have: >> [quoted text clipped - 25 lines] > > And now you know. thank you very much to all for your help.. I finally managed, thus:
public class renameRandom {
public static void main(String[] args) {
int posDot; String _temp = ""; String no = ""; File oldFile; int __indx; int _indx; int indx; File directory = new File(System.getProperty("user.dir")); // if no arg passed start naming of imgs @ "1" // else start at whatever no. is passed... if (null == args || args.length < 1) { no = "1"; } else { no = args[0]; } __indx = Integer.parseInt(no); _indx = __indx - 1; String[] textFileNames = directory.list(new FilenameFilter() { public boolean accept(File dir, String name) { return name.endsWith(".jpg") || name.endsWith( ".JPG"); } }); ArrayList photos = new ArrayList(); for (int i=0; i < textFileNames.length; i++) { System.out.println(textFileNames[i] + " -- " + i); photos.add(new File(textFileNames[i])); } System.out.println(""); Collections.shuffle(photos); Object _photosArr[] = photos.toArray(); String photosArr = ""; File newFile; for (int i = 1; i < _photosArr.length+1; ++i) { photosArr = _photosArr[i-1].toString(); posDot = photosArr.indexOf("."); _temp = photosArr.substring(0,posDot); oldFile = new File(_temp + ".jpg"); indx = i + _indx; newFile = new File(indx + ".jpg"); oldFile.renameTo(newFile); System.out.println(_photosArr[i-1] + " -- " + newFile); System.out.println(photosArr + " ** " + newFile + "\n"); // above line u see it prints out correct new names.... }
} }
however, a problem remains:
1) if, after renaming, I have, say, imgs 1.jpg thru 15.jpg, then remove, for ex, 8.jpg and 9.jpg, and run class again, it still skips these two numbers and last img is still 15.jpg.. (but if you run the class and look @ printouts in console it shows correct names for newFile var...
in general I find class does not work well if when run the class files have already been renamed once to 1.jpg, etc.. as opposed to if files still have orig names (DSC_0004.jpg, etc..)
once again thank you all very much... this is the hardest thing I have tried to do in java...
Lew - 11 Mar 2008 00:45 GMT > String[] textFileNames = directory.list(new FilenameFilter() { > public boolean accept(File dir, String name) { [quoted text clipped - 13 lines] > Collections.shuffle(photos); > Object _photosArr[] = photos.toArray(); The trouble with this idiom is that you create an array, *copy* it into a List, then *copy* it back into an array. That's very wasteful. If you use Arrays.asList() as I suggested elsethread, then you skip both the repeated add() step and the toArray() step.
Reiterating the code fragment: public static File [] getImagesShuffled() { File directory = new File(System.getProperty("user.dir"));
File [] files = directory.listFiles( new FileFilter() { public boolean accept( File file ) { return file.getName().toLowerCase().endsWith(".jpg"); } } ); Collections.shuffle( Arrays.asList( files ) ); return files; }
This will save both memory and execution time, a rare case when there isn't a tradeoff between them.
You should also genericize your Collections classes when you do use them, and make the widest appropriate type for the variable even if the object type is narrower:
List <File> photos = new ArrayList <File> ();
 Signature Lew
maya - 11 Mar 2008 21:56 GMT >> String[] textFileNames = directory.list(new FilenameFilter() { >> public boolean accept(File dir, String name) { [quoted text clipped - 39 lines] > > List <File> photos = new ArrayList <File> (); Lew, thanks for your response.. it's not that I dont pay attention to responses.. but sometimes responders post just a snippet of code that I don't know where to put it in the class and dont know how to make it work and such.. I new if I could convert that ArrayList back to a regular array it would work.. so I just figured out how to do that and it worked...;) (well, sort of, as I mentioned yesterday I'm still having some problems..)
the code you post today,
public static File[] getImagesShuffled()
what is this? doesn't look like a method.. is it a class? I put this class inside my class and call it from my class? it's an inner class, right? sorry, this is why I get confused sometimes, how do I call this class from inside my class?? not sure exactly what part of my code to replace w/this code...
thank you...
Lew - 12 Mar 2008 01:18 GMT > the code you post today, > [quoted text clipped - 5 lines] > class from inside my class?? not sure exactly what part of my code to > replace w/this code... This is a method, lifted from my earlier post, that you put inside the class. The parentheses are a clue. As is the 'return' statement before the closing brace.
It is shown as a 'static' method, but could be implemented as an instance method instead.
You call it from another method, such as main() in the same class, by an invocation:
File [] shuffledImages = getImagesShuffled();
This was shown in my earlier post.
Defining methods: <http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.4> <http://java.sun.com/docs/books/tutorial/java/javaOO/methods.html>
Invoking methods: <http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.12> <http://java.sun.com/docs/books/tutorial/java/javaOO/returnvalue.html>
 Signature Lew
maya - 17 Mar 2008 01:49 GMT >> the code you post today, >> [quoted text clipped - 28 lines] > > <http://java.sun.com/docs/books/tutorial/java/javaOO/returnvalue.html> ok, I found your earlier post, Lew, with the method and the call to it (yes, it did look like a method to me, but I had never seen a method declared like an array, so I was a bit confused..) so now have done thus:
public class renameRandom {
public static void main(String[] args) { int _indx; int indx; int iRenTo = 0; File newFile;
// if no arg passed start naming of files @ "1" // else start at whatever no. is passed... if (null == args || args.length < 1 || args[0].equals("0")) { indx = Integer.parseInt("0"); } else { _indx = Integer.parseInt(args[0]); indx = _indx - 1; }
File [] shuffledFiles = getImagesShuffled();
for (int i = 0; i < shuffledFiles.length; ++i) { iRenTo = ++indx; newFile = new File(iRenTo + ".jpg"); System.out.println( shuffledFiles[i] + " -- of ::: " + newFile + " -- nf" ); shuffledFiles[i].renameTo(newFile); }
}
public static File[] getImagesShuffled() { File directory = new File(System.getProperty("user.dir")); File[] files = directory.listFiles( new FileFilter() { public boolean accept( File file ) { return file.getName().toLowerCase().endsWith(".jpg"); } } ); Collections.shuffle( Arrays.asList( files ) ); return files; }
}
and this works fine except I would like the option of running the class again to shuffle the images again, but, just like before, once the files are named 1.jpg, 2.jpg, etc.. (as opposed to orig names like DSC_0004.JPG, DSC_0023.JPG, etc..) the renameTo() stmt gets IGNORED.. the images ARE being shuffled every time I run the class (as can be seen by what the printout-stmt returns...), but they only get renamed the first time I run the class (before imgs are named "1.jpg", etc..) I have been working on this for about two hours now, still don't know why..
thank you..
Jeff Higgins - 07 Mar 2008 18:48 GMT >> import java.io.File; >> import java.io.FilenameFilter; [quoted text clipped - 49 lines] > } > }); for (int i = 0; i < textFileNames.length; ++i) { textFileNames[i] = i + ".jpg"; }
> ArrayList photos = new ArrayList(); > for (int i=0; i < textFileNames.length; i++) { [quoted text clipped - 16 lines] > > thank you very much.. Jeff Higgins - 07 Mar 2008 19:18 GMT Oops!
> for (int i = 0; i < textFileNames.length; ++i) { > textFileNames[i] = i + ".jpg"; > } for (int i = 0; i < textFileNames.length; ++i) { textFileNames[i] = i + ".jpg"; new File(textFileNames[i]).renameTo(new File(i + ".jpg")); }
Jeff Higgins - 07 Mar 2008 19:41 GMT > Oops! >> for (int i = 0; i < textFileNames.length; ++i) { [quoted text clipped - 5 lines] > new File(textFileNames[i]).renameTo(new File(i + ".jpg")); > } Let me try this again.
for (int i = 0; i < textFileNames.length; ++i) { String current = directory.getAbsolutePath() + File.separator + i + ".jpg"; String temp = directory.getAbsolutePath() + File.separator + textFileNames[i]; new File(temp).renameTo(new File(current)); textFileNames[i] = current; }
Lew - 08 Mar 2008 04:27 GMT <http://java.sun.com/javase/6/docs/api/java/io/File.html#listFiles(java.io.FileFilter)>
You can retrieve the list as Files directly, so you needn't create a copy of each one.
> import java.io.File; import java.io.FileFilter;
> import java.util.ArrayList; import java.util.Arrays;
> import java.util.Collections; > > public class ShuffleImages { > > public static void main(String[] args) { File [] shuffledFiles = getImagesShuffled(); // do something with them }
public static File [] getImagesShuffled() {
> File directory = new File(System.getProperty("user.dir")); File [] files = directory.listFiles( new FileFilter() { public boolean accept( File file ) { return file.getName().toLowerCase().endsWith(".jpg"); } } ); Collections.shuffle( Arrays.asList( files ) ); return files;
> } > }
 Signature Lew
Jeff Higgins - 25 Feb 2008 23:43 GMT >> hi, >> [quoted text clipped - 4 lines] > what I want is a list betw. 1 and a given no., but that no number appears > more than once in the list.. is this possible?? import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Random; import java.util.Set;
public class Test {
public static void main(String[] args) { List<Integer> randomIntegers = new ArrayList<Integer> (NoDuplicateListOfRandomIntegers. getRandomList(100, 1, 999)); for(int i = 0; i < randomIntegers.size(); i++) { System.out.println(i + " " + randomIntegers.get(i)); } }
public static class NoDuplicateListOfRandomIntegers {
private static Random rand = new Random();
public static List<Integer> getRandomList(int size, int low, int high) { if(high <= size) { throw new IllegalArgumentException(); } Set<Integer> integers = new HashSet<Integer>(); while(integers.size() < size) { integers.add(rand.nextInt(high - low + 1 ) + low); } List<Integer> ret = new ArrayList<Integer>(); ret.addAll(integers); return ret; } } }
Jeff Higgins - 26 Feb 2008 00:41 GMT Oops! having just read RedGrittyBrick's & Patricia's comments; with a size argument of 1,000,000 I get +14 million iterations. Scratch this one. :( Thanks.
> public static class NoDuplicateListOfRandomIntegers { > [quoted text clipped - 15 lines] > } > } Jeff Higgins - 25 Feb 2008 22:38 GMT > hi, > > am trying to find out how to use random() method.. what is construction > if, say, I want to generate a random no. betw. 1 and 100.. If you're not constrained to Math.random(), see this. <http://mindprod.com/jgloss/pseudorandom.html#LOWHIGH>
rossum - 26 Feb 2008 12:31 GMT Others have dealt with your Math.random() question.
>AND: if I want to look up java tutorial on this, how do you search for >class, method, etc.. you want here? [quoted text clipped - 6 lines] > >thank you... I suspect that you are talking about the Sun Java reference site: http://java.sun.com/javase/reference/index.jsp
or possibly just the API documentation: http://java.sun.com/javase/6/docs/api/ (v6) or http://java.sun.com/j2se/1.5.0/docs/api/ (v5).
The API documentation is available as download from Sun's site.
rossum
Roedy Green - 27 Feb 2008 10:34 GMT >am trying to find out how to use random() method.. what is construction >if, say, I want to generate a random no. betw. 1 and 100 see http://mindprod.com/jgloss/pseudorandom.html --
Roedy Green Canadian Mind Products The Java Glossary http://mindprod.com
Roedy Green - 11 Mar 2008 02:38 GMT >this method apparently takes no arguments, so how do you tell it in what >range (betw what nos.) you want the random no. generated? see http://mindprod.com/jgloss/pseudorandom.html --
Roedy Green Canadian Mind Products The Java Glossary http://mindprod.com
Free MagazinesGet these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...
|
|
|