2011-12-23 11 views
35

मुझे पहले से मौजूद किसी भी संख्या को गुणा करने के लिए यादृच्छिक -1 या 1 बनाना होगा। समस्या यह है कि मेरा वर्तमान यादृच्छिक फ़ंक्शन -1, 0, या 1 उत्पन्न करता है। ऐसा करने का सबसे प्रभावी तरीका क्या है?जावास्क्रिप्ट यादृच्छिक सकारात्मक या नकारात्मक संख्या

उत्तर

92

अपने मौजूदा फ़ंक्शन का उपयोग न करें - बस Math.random() पर कॉल करें। तो < 0.5 -1, और 1:

var plusOrMinus = Math.random() < 0.5 ? -1 : 1; 
+4

निर्माण पूरी तरह से, मजाकिया मैं नहीं एक जवाब कहीं भी ऑनलाइन मिल सकता है। –

+1

अच्छा सुरुचिपूर्ण समाधान, धन्यवाद –

9
सिर्फ मनोरंजन के लिए

:

var plusOrMinus = [-1,1][Math.random()*2|0]; 

या

var plusOrMinus = Math.random()*2|0 || -1; 

लेकिन तुम्हें क्या लगता पोषणीय हो जाएगा का उपयोग करें।

+1

एक ओर, मुझे कहना चाहिए कि पठनीयता के लिए कुछ कहा जाना चाहिए। दूसरी ओर, मेरे उत्तर से 3 वर्णों को शेविंग करने के लिए कुडोस (हालांकि मैं तर्क दे सकता हूं कि सभी 3 वर्ण अनावश्यक सफेद जगह हैं)। यदि आप '0.5' से' 0' को भी खत्म करते हैं तो मेरा 1 वर्ण छोटा होता है। :-) – ziesemer

+0

हाँ, बस मस्ती के लिए। :-) – RobG

+0

जो कोड का एक टुकड़ा है! – egidiocs

35

मैं हमेशा

Math.round(Math.random()) * 2 - 1 

के रूप में यह सिर्फ एक तरह से समझ में आता है के एक प्रशंसक किया गया है।

  • Math.round(Math.random()) आप 0 या 1

  • दे देंगे 2 से परिणाम गुणा आप 0 या 2

  • दे देंगे और फिर 1 घटाने पर आपको देता -1 या 1.

सहज ज्ञान युक्त!

+0

@RobG - आप सही हैं, महोदय – majman

+0

मेरी राय में यह एक बेहतर "यादृच्छिक" - या + निर्माता है। चयनित उत्तर सिर्फ मेरे लिए काम नहीं करता है क्योंकि क्या होगा यदि मुझे 4 से कम की संख्या चाहिए जो नकारात्मक नहीं है? यह सिर्फ एक बेहतर समाधान के आसपास है। – Brendan

3

पिछले उत्तरों के रूप में इसे करने के लिए वास्तव में बहुत सारे तरीके हैं।

गणित.गोल() और math.random का सबसे तेजी से किया जा रहा है संयोजन:

// random_sign = -1 + 2 x (0 or 1); 
random_sign = -1 + Math.round(Math.random()) * 2; 

तुम भी गणित.क्योंकि (उपयोग कर सकते हैं) (which is also fast):

// cos(0) = 1 
// cos(PI) = -1 
// random_sign = cos(PI x (0 or 1)); 
random_sign = Math.cos(Math.PI * Math.round(Math.random())); 
3

कारण है कि आप की कोशिश न :

(Math.random() - 0.5) * 2 

अभी भी यादृच्छिक संख्या के अतिरिक्त लाभ के साथ ऋणात्मक मूल्य रखने का 50% मौका उत्पन्न बियर

या यदि वास्तव में एक -1/1 की जरूरत है:

Math.ceil((Math.random() - 0.5) * 2) < 1 ? -1 : 1; 
संबंधित मुद्दे