এই জিএলএসএল র‌্যান্ড () ওয়ান-লাইনারের উত্স কী?


94

আমি এই ছদ্ম-এলোমেলো নম্বর জেনারেটরটি শেডারে ব্যবহারের জন্য এখানে এবং সেখানে ওয়েবের চারপাশে উল্লেখ করেছি :

float rand(vec2 co){
  return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);
}

একে বিভিন্নভাবে "ক্যানোনিকাল" বলা হয়, বা "ওয়েবে আমি কোথাও একটি ওয়ান লাইনার পেয়েছি"।

এই ফাংশনটির উত্স কী? ধ্রুব মানগুলি যেমন মনে হয় তত স্বেচ্ছাচারিতা বা তাদের নির্বাচনের কোনও শিল্প আছে? এই ফাংশনটির যোগ্যতা নিয়ে কোন আলোচনা আছে?

সম্পাদনা: আমি এই ফাংশনটির প্রাচীনতম উল্লেখটি ফেব্রুয়ারী'০৮ থেকে আর্কাইভটি পেয়েছি , মূল পৃষ্ঠাটি এখন ওয়েব থেকে চলে গেছে। তবে অন্য কোথাও এর চেয়ে সেখানে আর কোনও আলোচনা নেই।


এটি একটি শোর ফাংশন, প্রক্রিয়াগতভাবে উত্পন্ন ভূখণ্ড তৈরি করতে ব্যবহৃত হয়। ভালো কিছু করার জন্য অনুরূপ en.wikipedia.org/wiki/Perlin_noise
foreyez

উত্তর:


42

খুব মজার প্রশ্ন!

উত্তরটি টাইপ করার সময় আমি এটি অনুধাবন করার চেষ্টা করছি :) এটির সাথে খেলতে প্রথমে একটি সহজ উপায়: http://www.wolframalpha.com/input/?i=plot%28+mod%28+sin%28x*12.9898 +% 2B + y * 78.233% 29 + * + 43758.5453% 2C1% 29x% 3D0..2% 2C + y% 3D0..2% 29

তাহলে আসুন আমরা এখানে কী করার চেষ্টা করছি সে সম্পর্কে ভাবা যাক: দুটি ইনপুট স্থানাঙ্কের জন্য x, y আমরা একটি "এলোমেলো সংখ্যা" ফিরিয়ে দেব। এখন এটি যদিও এলোমেলো সংখ্যা নয়। প্রতিবার আমরা একই x, y ইনপুট করলে এটি একই হয়। এটি একটি হ্যাশ ফাংশন!

ফাংশনটি প্রথম জিনিসটি 2 ডি থেকে 1 ডি তে যেতে হয়। এটি নিজের মধ্যে আকর্ষণীয় নয় তবে সংখ্যাগুলি বেছে নেওয়া হয়েছে যাতে তারা সাধারণত পুনরাবৃত্তি না করে। এছাড়াও আমাদের সেখানে একটি ভাসমান পয়েন্ট সংযোজন রয়েছে। Y বা x থেকে আরও কয়েকটি বিট থাকবে, তবে সংখ্যাটি ঠিক বেছে নেওয়া যেতে পারে তাই এটি মিশ্রণ করে।

তারপরে আমরা একটি ব্ল্যাক বক্স সিন () ফাংশন নমুনা করি। এটি বাস্তবায়নের উপর অনেক নির্ভর করবে!

অবশেষে এটি ভগ্নাংশকে গুণ এবং গ্রহণের মাধ্যমে পাপ () প্রয়োগের ক্ষেত্রে ত্রুটি প্রশস্ত করে।

আমি মনে করি না এটি সাধারণ ক্ষেত্রে এটি একটি ভাল হ্যাশ ফাংশন। পাপ () জিপিইউতে একটি কালো বাক্স, সংখ্যাগতভাবে u প্রায় কোনও হ্যাশ ফাংশন গ্রহণ করে এবং রূপান্তর করে এটি আরও ভাল একটি নির্মাণ করা সম্ভব। শক্ত অংশটি হ'ল সিপিইউ হ্যাশিংয়ে ব্যবহৃত সাধারণ পূর্ণসংখ্যা অপারেশনটিকে ফ্লোট (অর্ধ বা 32 বিট) বা ফিক্সড পয়েন্ট অপারেশনে রূপান্তর করা, তবে এটি সম্ভব হওয়া উচিত।

আবার হ্যাশ ফাংশন হিসাবে এটির সাথে আসল সমস্যাটি হ'ল পাপ () একটি ব্ল্যাক বক্স।


4
এটি উত্স সম্পর্কে প্রশ্নের উত্তর দেয় না, তবে আমি মনে করি এটি সত্যিই জবাবদিহি করতে পারে না। উদাহরণস্বরূপ গ্রাফের কারণে আমি এই উত্তরটি গ্রহণ করব।
গ্রুমড্রিগ

19

মূলটি সম্ভবত কাগজটি: "y = [(a + x) পাপ (বিএক্স)] মড 1" এর সাহায্যে এলোমেলো সংখ্যা তৈরি করার সময়, ডব্লিউজেজে রে, পরিসংখ্যানবিদদের 22 তম ইউরোপীয় সভা এবং সম্ভাবনা তত্ত্বের 7 ম ভিলনিয়াস সম্মেলন এবং গাণিতিক পরিসংখ্যান, আগস্ট 1998

সম্পাদনা: যেহেতু আমি এই কাগজটির একটি অনুলিপি খুঁজে পাচ্ছি না এবং "TestU01" রেফারেন্সটি পরিষ্কার নাও হতে পারে, তাই সিউডো-সি-তে টেস্টইউ 01 তে বর্ণিত স্কিমটি এখানে রয়েছে:

#define A1 ???
#define A2 ???
#define B1 pi*(sqrt(5.0)-1)/2
#define B2 ???

uint32_t n;   // position in the stream

double next() {
  double t = fract(A1     * sin(B1*n));
  double u = fract((A2+t) * sin(B2*t));
  n++;
  return u;
} 

যেখানে একমাত্র প্রস্তাবিত ধ্রুবক মান হ'ল বি 1।

লক্ষ্য করুন যে এটি একটি স্ট্রিমের জন্য। 1 ডি হ্যাশ 'এন' তে রূপান্তরকরণ পূর্ণসংখ্যার গ্রিডে পরিণত হয়। সুতরাং আমার অনুমান যে কেউ এটিকে দেখেছিল এবং 'টি' কে একটি সাধারণ ফাংশনে রূপান্তর করেছে (এক্স, ওয়াই) converted উপরের আসল ধ্রুবকগুলি ব্যবহার করে ফল পাওয়া যাবে:

float hash(vec2 co){
  float t = 12.9898*co.x + 78.233*co.y; 
  return fract((A2+t) * sin(t));  // any B2 is folded into 't' computation
}

4
সত্যিই খুব আকর্ষণীয়! আমি এমন একটি কাগজ পেয়েছি যা এটি গুগল বইয়ে নিজেই জার্নালের পাশাপাশি এটি উল্লেখ করে তবে মনে হয় যে টক বা কাগজ নিজেই জার্নালে অন্তর্ভুক্ত ছিল না।
গ্রুমড্রিগ্র

4
এছাড়াও, শিরোনাম থেকে এটি প্রদর্শিত হবে যে আমি যে ফাংশনটির বিষয়ে জিজ্ঞাসা করছি তার fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * (co.xy + vec2(43758.5453, SOMENUMBER))সাথে পেপারটি যে ফাংশনটি করছে তার সাথে ফাংশন মেনে চলতে হবে।
গ্রুমড্রিগ

এবং আরও একটি বিষয়, যদি এটি প্রকৃতপক্ষে ফাংশনটি ব্যবহারের উত্স হয়, তবে যাদুর সংখ্যাগুলি (পছন্দ aএবং পছন্দ b) এর উত্সের প্রশ্নটি বারবার ব্যবহৃত হয়, তবে আপনি যে কাগজে উদ্ধৃত করেছেন সেই কাগজে ব্যবহার করা যেতে পারে।
গ্রুমড্রিগ

আমি আর কাগজটি পাই না। (সম্পাদনা করুন: উপরে লিঙ্কযুক্ত একই কাগজ)
এমবি

উত্তরটি আরও তথ্যের সাথে আপডেট করুন।
এমবি রেইনোল্ডস

8

ধ্রুবক মানগুলি নির্বিচারে হয়, বিশেষত যে এগুলি খুব বড় এবং মূল সংখ্যা থেকে কয়েক দশক দূরে।

4000 দ্বারা গুণিত হাই হাই প্রশস্ততা সাইনাসের 1 এরও বেশি একটি মডুলাস একটি পর্যায়ক্রমিক ফাংশন। এটি একটি উইন্ডো অন্ধের মতো বা একটি corেউখেলান ধাতু খুব ছোট তৈরি হয়েছে কারণ এটি 4000 দ্বারা গুণিত হয়েছে এবং বিন্দুর দ্বারা কোণে পরিণত হয়েছে।

ফাংশনটি 2-ডি হওয়ায় ডট পণ্যটির X এবং Y অক্ষের সাথে সম্পর্কিত একটি পর্যায়ক্রমিক ফাংশন ঘুরিয়ে দেওয়ার প্রভাব রয়েছে। প্রায় 13/79 অনুপাত দ্বারা। এটি অদক্ষ, আপনি আসলে (13x + 79y) এর সাইনাস করে একই অর্জন করতে পারবেন এটিও কম গণিতের সাথে আমার মনে হয় একই জিনিস অর্জন করবে ..

আপনি যদি X এবং Y উভয় ক্ষেত্রে ফাংশনটির সময়সীমাটি খুঁজে পান তবে আপনি এটির নমুনা তৈরি করতে পারেন যাতে এটি আবার একটি সাধারণ সাইন ওয়েভের মতো দেখতে।

এটি গ্রাফে জুম করা একটি ছবি এখানে

আমি উত্সটি জানি না তবে এটি অন্য অনেকের মতোই, আপনি যদি নিয়মিত বিরতিতে গ্রাফিকগুলিতে এটি ব্যবহার করেন তবে এটি মোয়ার প্যাটার্ন উত্পন্ন করতে পারে এবং আপনি দেখতে পাচ্ছেন এটি শেষ পর্যন্ত আবার ঘুরে গেছে।


তবে জিপিইউতে এক্স এবং ওয়াইয়ের পরিসীমা ০.১ থেকে এবং আপনি যদি নিজের গ্রাফটি পরিবর্তন করেন তবে এটি অনেক বেশি এলোমেলো দেখায়। আমি জানি এটি একটি বিবৃতি মত শোনাচ্ছে কিন্তু এটি আসলে একটি প্রশ্ন, কারণ আমার গণিত শিক্ষাটি 18 বছর বয়সে শেষ হয়েছিল।
স্ট্রিংগুলি

আমি জানি, আমি কেবল জুম বাড়িয়েছি যাতে আপনি দেখতে পারেন যে এলোমেলো ফাংশনটি সেই রূপের ব্যতীত যে শ্যাওলাগুলি খুব দ্রুত পরিবর্তিত হয়, আপনি পরিবর্তনগুলি দেখতে একেবারে ছোট ছোট করতে না পারেন ... আপনি কল্পনা করতে পারেন যে পয়েন্টগুলি গ্রহণ করছে রেডগুলিতে 1 থেকে 1 x এবং y মানের জন্য 0 থেকে 1 উচ্চতা পর্যন্ত সুন্দর এলোমেলো সংখ্যা দেবে।
পরস্পর

ওহ, আমি বুঝতে পেরেছি, এবং এটি যে কোনও র্যান্ডম সংখ্যার প্রজন্মের পক্ষে খুব যৌক্তিক বলে মনে হয় যা এর মূল অংশে একটি পাপ কাজ করে
স্ট্রিংস

4
এটি মূলত একটি লিনিয়ার জিগজ্যাগ এবং পাপটি একটি ক্ষুদ্র প্রকরণকে যুক্ত করার কথা, এটি একই রকম যদি কেউ আপনার সামনে 10 থেকে 10 খুব দ্রুত রাউন্ড এবং বৃত্তাকারে একটি কার্ডের একটি প্যাকেট ক্লিক করছে এবং আপনি চেষ্টা করার কথা আছেন কার্ডগুলি থেকে সংখ্যার একটি প্যাটার্ন শেষ করুন, এগুলি এলোমেলো সংখ্যায় হবে কারণ এটি খুব দ্রুত ঝাঁকুনিতে পড়বে যে কার্ডগুলি কতটা দ্রুত গতিতে চলেছে তার সাথে সম্পর্কিত একটি সঠিক সিঙ্ক্রোনাইজেশনে কার্ডগুলি বেছে নিয়ে তিনি কেবল একটি প্যাটার্ন পেতে পারেন।
অ্যালিয়েনশিয়াল

শুধু একটি নোট, এটা করতে দ্রুত হবে না (13x + 79y)যেহেতু dot(XY, AB)ঠিক কি আপনি তার ডট পণ্য, যেমন বর্ণনা কি করতে হবে যাx,y dot 13, 79 = (13x + 79y)
whn

1

হতে পারে এটি কিছু অ-পুনরাবৃত্তি বিশৃঙ্খলা ম্যাপিং, তারপরে এটি অনেকগুলি বিষয় ব্যাখ্যা করতে পারে তবে এটি বৃহত সংখ্যার সাথে কেবল কিছু স্বেচ্ছাচারিত হেরফের হতে পারে।

সম্পাদনা: মূলত, ফাংশন ফ্র্যাক্ট (পাপ (এক্স) * 43758.5453) হ্যাশ-এর ​​মতো একটি সাধারণ ফাংশন, পাপ (এক্স) -1 থেকে 1 এর মধ্যে মসৃণ পাপ অন্তরঙ্গকরণ সরবরাহ করে, তাই পাপ (এক্স) * 43758.5453 থেকে বিভাজন হবে - 43758.5453 থেকে 43758.5453 এ। এটি একটি বিস্তৃত পরিসীমা, তাই এক্সের এমনকি ছোট পদক্ষেপ ফলশ্রুতিতে বড় পদক্ষেপ এবং ভগ্নাংশের অংশে সত্যই বৃহত প্রকরণ সরবরাহ করবে। "ফ্র্যাক্ট" এর মান -0.99 ... থেকে 0.999 ... পর্যন্ত মান পেতে প্রয়োজন। এখন, যখন আমাদের হ্যাশ ফাংশনের মতো কিছু রয়েছে তখন আমাদের ভেক্টর থেকে প্রোডাকশন হ্যাশের জন্য ফাংশন তৈরি করা উচিত। সবচেয়ে সহজ উপায়টি ইনপুট ভেক্টরের যেকোন ওয়াই উপাদানগুলির জন্য স্পেশালি কল "হ্যাশ"। তবে তারপরে আমাদের কিছু প্রতিসম মান হবে। সুতরাং, আমাদের ভেক্টরের কাছ থেকে কিছু মূল্য পাওয়া উচিত, পদ্ধতির কিছু র্যান্ডম ভেক্টর সন্ধান করা এবং সেই ভেক্টরের কাছে "ডট" পণ্যটি পাওয়া উচিত, এখানে আমরা যাচ্ছি: ফ্র্যাক্ট (পাপ (বিন্দু (co.xy,, vec2 (12.9898,78.233)) * 43758.5453); এছাড়াও, নির্বাচিত ভেক্টর অনুসারে, "ডট" পণ্যটি গণনা করার পরে "পাপ" ফাংশনের কয়েকটি পেরিওড থাকতে এর দৈর্ঘ্য দীর্ঘতর হওয়া উচিত।


তবে 4e5 এর পাশাপাশি কাজ করা উচিত, কেন আমি জানি না কেন যাদু নম্বর 43758.5453। (এছাড়াও, আমি র‌্যান্ড (0) = 0 এড়ানোর জন্য কিছু ভগ্নাংশের সংখ্যার সাথে এক্স অফসেট করব
ফ্যাব্রিস নেইরেট

4
আমি মনে করি 4e5 দিয়ে আপনি ভগ্নাংশ বিটের এত বেশি প্রকরণ পাবেন না, এটি সর্বদা আপনাকে একই মান দেবে। সুতরাং, দুটি শর্ত পূরণ করতে হবে, যথেষ্ট বড় এবং ভগ্নাংশের অংশগুলির যথেষ্ট ভাল পার্থক্য থাকতে হবে।
রোমান

আপনার অর্থ কী, "সর্বদা আপনাকে একই মান দেবে"? (যদি আপনি বোঝাতে চান এটি সর্বদা একই অঙ্কগুলি নেবে, প্রথমত, তারা এখনও বিশৃঙ্খল, দ্বিতীয়, ভাসমানটি এম * 2 ^ পি হিসাবে সংরক্ষণ করা হয়, 10 ^ পি নয়, তাই * 4e5 এখনও স্ক্র্যাবল বিটস)।
ফ্যাব্রিস নাইরেট

আমি ভেবেছিলাম আপনি সংখ্যাটির ঘনিষ্ঠভাবে উপস্থাপনা লিখেছিলেন, 4 * 10 ^ 5, সুতরাং পাপ (এক্স) * 4e5 আপনাকে এত বিশৃঙ্খলাযুক্ত নম্বর দেবে না। আমি সম্মত হই যে পাপ তরঙ্গ থেকে ভগ্নাংশ বিট আপনাকে ভাল চ্যাটওিক দেবে।
রোমান

তবে, এটি x এর পরিসরের উপর নির্ভর করে, এর অর্থ যদি ফাংশনটি ছোট (-0.001, 0.001) এবং বড় মানের (-1, 1) এর জন্য শক্তিশালী হয়। আপনি ফ্র্যাক্ট (পাপ (x /1000.0) * 43758.5453) এর সাথে পার্থক্য দেখার চেষ্টা করতে পারেন; এবং ফ্র্যাক্ট (পাপ (x /1000.0) * 4e5) ;, যেখানে এক্স রেঞ্জ [-1।, 1.]। দ্বিতীয় বৈকল্পিক চিত্রটি আরও একঘেয়ে হয়ে উঠবে (কমপক্ষে আমি শেডারের মধ্যে পার্থক্যটি দেখতে পাচ্ছি)। তবে, সাধারণভাবে, আমি সম্মত হই যে আপনি এখনও 4e5 ব্যবহার করতে পারেন এবং ভাল ফলাফল পেতে পারেন।
রোমান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.